0

私は、Zazzle アプリケーションがナビゲーション バーを行うのと同様の方法でナビゲーション バーを実装する必要があるプロジェクトに取り組んでいます。アニメーションは私の専門知識ではないので、そのようなアニメーションを実装する方法について、開発者コミュニティからいくつかのアイデアを得たいと思います。

これはナビゲーション ドロワーの画像です。前のフラグメントが左側に表示されていることに注意してください。

Zazzle_navigation_Drawer

メニューボタンを押した時のナビ遷移のスクリーンショットです。向きを変えて画面の右側に隠れ、メニューを閉じるとそのプロセスが逆になります。

Zazzle_nav_transition

これがどのように実装されるかについての提案と、この効果を再現する良いショットを撮るために使用するリソースや学ぶべき情報についての提案を探しています.

私がこれまでにやってきたこと。

Sliding Animations DevBytes ビデオを見てメモを取りました。したがって、これまでの私の戦略は、ナビゲーションを他のすべての画面と一緒に断片化し、その間にいくつかのスライド アニメーションを実装しようとすることです。これで基礎が身につくと思います。

したがって、私はアニメーションがどのように構築されるかについてもっと尋ねています。私は以前にアニメーションを行ったことがないので、Android でカスタム アニメーションが一般的にどのように実装されているかについて助けを求めています。

4

1 に答える 1

0

誰かがこれに出くわしたら...

Android 開発者トレーニングWeb サイトのサンプル プロジェクトを使用して、これを理解しました。res に anim フォルダーを作成し、オブジェクト animator タグを使用して xml セット ファイルを追加しました。目的のアニメーションを取得するために値を正しく操作する方法を理解していませんでしたが、いくつか突っ込んだ後、次のことに気付きました

 <objectAnimator
    android:valueFrom=
    android:valueTo=
    android:propertyName="
    android:interpolator=
    android:duration= />

valueFrom タグと valueTo タグは、アニメーションが実行されるポイントを定義し、android が残りを埋めます。プロパティ名は、操作されているモーションの種類 (translationX、translationY、rotationX、translationY、scaleX、および scaleY) を記述するために使用されます。補間器はアニメーションの変化率を設定し、最後に期間はアニメーションにかかる時間を指定します。

アニメーション ファイルが作成されると、次のコードを使用して、トランザクション中にフラグメントにアニメーションを設定できます。

 getFragmentManager()
                    .beginTransaction()        
                    .setCustomAnimations(
                            R.animator.exampleOut, R.animator.exampleIn,
                            R.animator.exampleOut, R.animator.exampleIn, 
                    ).add(R.id.container, new mFragment()).addToBackStack(null).commit();\

setCustomAnimations() の最初の 2 つのパラメータは、トランザクションが開始されたときの 2 つのフラグメントのモーションを設定し、最後の 2 つのパラメータは、トランザクションが逆になったとき、つまり戻るボタンが押されたときの 2 つのフラグメントのモーションを設定します。

これを使用して目的のアニメーションを実現できますが、何らかの理由でアウトバウンド フラグメントが表示されなくなることがわかりました。そのため、次のように AnimatorListener を使用する必要がありました。

Animator.AnimatorListener listener = new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator arg0) {
            getFragmentManager()
                    .beginTransaction()        
                    .setCustomAnimations(
                            R.animator.exampleOut, 0,
                            0, R.animator.exampleIn
                    )


                    .add(R.id.container, new mFragment())

                    .addToBackStack(null)

                    .commit();
        }
    };
    slideback(listener);

    mHandler.post(new Runnable() {
        @Override
        public void run() {
            invalidateOptionsMenu();
        }
    });
}

private void slideback(Animator.AnimatorListener listener) {
    View movingFragmentView = cardFrontFragment.getView();

    PropertyValuesHolder rotateY =  PropertyValuesHolder.ofFloat("rotationY", 15f);
    PropertyValuesHolder scaleX =  PropertyValuesHolder.ofFloat("scaleX", 0.8f);
    PropertyValuesHolder scaleY =  PropertyValuesHolder.ofFloat("scaleY", 0.8f);
    PropertyValuesHolder translateX = PropertyValuesHolder.ofFloat("translationX", 500f);
    ObjectAnimator movingFragmentAnimator = ObjectAnimator.
            ofPropertyValuesHolder(movingFragmentView, rotateY, scaleX, scaleY, translateX);



    ObjectAnimator movingFragmentRotator = ObjectAnimator.
            ofFloat(movingFragmentView, "rotationY",15f, 0f);
    movingFragmentAnimator.setDuration(DURATION_TIME);
    movingFragmentRotator.setStartDelay(DELAY_TIME);


    AnimatorSet s = new AnimatorSet();
    s.playTogether(movingFragmentAnimator, movingFragmentRotator);
    s.addListener(listener);
    s.start();
}
private void slideForward (Animator.AnimatorListener listener) {
    View movingFragmentView = cardFrontFragment.getView();

    PropertyValuesHolder rotateY =  PropertyValuesHolder.ofFloat("rotationY", 15f);
    PropertyValuesHolder scaleX =  PropertyValuesHolder.ofFloat("scaleX", 1.0f);
    PropertyValuesHolder scaleY =  PropertyValuesHolder.ofFloat("scaleY", 1.0f);
    PropertyValuesHolder translateX = PropertyValuesHolder.ofFloat("translationX", 0f);
    ObjectAnimator movingFragmentAnimator = ObjectAnimator.
            ofPropertyValuesHolder(movingFragmentView, rotateY, scaleX, scaleY, translateX);



    ObjectAnimator movingFragmentRotator = ObjectAnimator.
            ofFloat(movingFragmentView, "rotationY",15f, 0f);
    movingFragmentAnimator.setDuration(DURATION_TIME);
    movingFragmentRotator.setStartDelay(DELAY_TIME);
    movingFragmentRotator.setDuration(DURATION_TIME);


    AnimatorSet s = new AnimatorSet();
    s.playTogether(movingFragmentAnimator, movingFragmentRotator);
    s.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
           mShowingBack = false;
        }
    });
    s.start();
}

これにより、実行時にアウトバウンド フラグメントのプロパティを動的に設定でき、何らかの理由でフラグメントを表示したままにすることができます。

于 2014-08-17T10:51:08.063 に答える