web-dev-qa-db-ja.com

ドロワーアイコンをsetDisplayHomeAsUpEnabledの矢印にアニメーション化しますか?

引き出しの「ハンバーガー」アイコンの代わりに矢印を表示するためにsetDisplayHomeAsUpEnabledを使用していますが、アニメーション化されていません。代わりに、即座に描画可能な矢印が表示されます。

ホーム画面:(アルバム1)

映画をタップすると:(Album 2)

問題は、引き出しをスライドさせたときにアイコンがアニメーションを正常に実行することです。このため、おそらくsetDisplayHomeAsUpEnabledを使用することになっていないと思われます。(Album 3)

アルバム:http://imgur.com/a/LkXbh

引き出しの切り替えコードは次のとおりです。

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    drawerAdapter = new DrawerAdapter(this, App.getNavItems(), getSupportFragmentManager());
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerList = (ExpandableListView) findViewById(R.id.left_drawer);

    // Set onGroupClick and onChildClick
    drawerAdapter.setClickEvents(MainActivity.this, drawerLayout, drawerList);
    drawerList.setAdapter(drawerAdapter);

    ActionBarDrawerToggle toolbarDrawerToggle = new ActionBarDrawerToggle(
            this,                 
            drawerLayout,        
            toolbar,             
            R.string.drawer_open, 
            R.string.drawer_close 
    ) {

        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View view) {
            super.onDrawerOpened(view);
            invalidateOptionsMenu();
        }
    };
    drawerLayout.setDrawerListener(toolbarDrawerToggle);
    toolbarDrawerToggle.syncState();

EDIT:ドロワーを開くときではなく、すでに動作するアニメーションが欲しい。特定のフラグメントをロードすると、手動でアニメーションをトリガーしたいと思います。私は自分自身を正しく説明していないかもしれません。

19
Vextil

私はこれをテストしていませんが、0(引き出しを閉じた状態)と1(引き出しを開いた状態)の間のフロートをアニメートし、ActionBarDrawerToggle.onDrawerSlide(View, float)に値を渡すことでこれを達成できるかもしれません。これが、トグルがアニメーション化されたトグルの状態を決定する方法だと思います。

このような何かが動作するはずです。

ValueAnimator anim = ValueAnimator.ofFloat(start, end);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float slideOffset = (Float) valueAnimator.getAnimatedValue();
        toolbarDrawerToggle.onDrawerSlide(drawerLayout, slideOffset);
    }
});
anim.setInterpolator(new DecelerateInterpolator());
// You can change this duration to more closely match that of the default animation.
anim.setDuration(500);
anim.start();
78
Nathan Walters

質問が出されてから、別の方法が利用可能になりました。アニメーション化された矢印は、DrawerArrowDrawableを実装するパブリッククラスDrawableによって実装されます。

コードで、ナビゲーションアイコンを次のように設定します。

DrawerArrowDrawable drawerArrow = new DrawerArrowDrawable(this);
drawerArrow.setColor(myColor);

toolbar.setNavigationIcon(drawerArrow);

OnBackStackChangedListenerを登録し、矢印を手動でアニメーション化します。

@Override
public void onBackStackChanged() {
    boolean drawer = getSupportFragmentManager().getBackStackEntryCount() == 0;
    ObjectAnimator.ofFloat(drawerArrow, "progress", drawer ? 0 : 1).start();
}
20
Kirill Rakhman

意図したとおりに動作しているように聞こえます。setDisplayHomeAsUpEnabledを使用すると、ホームボタンを単に戻るボタンとして使用できます。アニメーションはありません。

ナビゲーションドロワーを使用していて、アニメーションにsetDisplayHomeAsUpEnabledを使用しない場合、およびマテリアルテーマ(少なくともAppCompat v21を使用)には、v7パッケージのActionBarDrawerToggleを使用してください。

Playストアは良い例です。最上位には、ナビゲーションドロワーと、ドロワーを開いたときにアニメーション化するハンバーガーを使用したアクティビティがあります。アプリをタップすると、戻る矢印のある新しいアクティビティが開きます。

0
Philio