繁体   English   中英

打开时的抽屉项目动画

[英]Drawer item animation when opened

我使用DrawerLayout创建了一个抽屉,其中包含带有项目的RecyclerView。 我还在RecyclerView上附加了layoutAnimation,以使项目在打开抽屉时从侧面进入。 第一次工作时会变桃红色,但是第二次打开抽屉时,一切都已经准备就绪。 我希望每次打开抽屉时都运行layoutAnimation。

到目前为止,我尝试过的是有一个自定义ActionBarDrawerToggle(无论如何我都需要),并添加以下内容:

@Override
public void onDrawerOpened(final View drawerView) {
    super.onDrawerOpened(drawerView);
    final RecyclerView recyclerView =
            (RecyclerView) drawerView.findViewById(R.id.drawer_content);
    if (recyclerView != null) {
        recyclerView.startLayoutAnimation();
    }
}

它之所以起作用,是因为它重新运行了动画,但是打开抽屉时所有项目都在那里,然后它们消失了,然后动画就开始了。

任何人都有解决方案,如何在每次关闭抽屉时“重置”抽屉项目视图?

不确定是否需要这些,但我还是会包括在内

<--! layout_animation.xml -->
<layoutAnimation
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/slide_from_right"
    android:delay="15%"
    android:animationOrder="normal"
    />

<--! slide_from_right.xml -->
<translate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="100%p"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:toXDelta="0"
    />

经过更多测试后,我发现了该解决方案,也许不是最漂亮的解决方案,但是它可以工作。 通过在抽屉关闭时隐藏内容,然后在开始动画之前使其再次可见,解决了我遇到的问题:

private boolean mFirstDrawerOpen = true;
private boolean mAnimationScheduled;

@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
    super.onDrawerSlide(drawerView, slideOffset);

    // The framework handles the first animation
    if (mIsFirstDrawerOpen) {
        mIsFirstDrawerOpen = false;
        return;
    }

    final RecyclerView recyclerView =
            (RecyclerView) drawerView.findViewById(R.id.drawer_content);

    if (mAnimationScheduled && recyclerView != null) {
        recyclerView.setVisibility(View.VISIBLE);
        recyclerView.startLayoutAnimation();
        mAnimationScheduled = false;
    } else if (slideOffset == 0f) {
        // Handles the case when the drawer is not completly opened and then closed,
        // which does not trigger onDrawerClosed()
        mAnimationScheduled = true;
    }
}

@Override
public void onDrawerOpened(final View drawerView) {
    super.onDrawerOpened(drawerView);

    mAnimationScheduled = false;
}

@Override
public void onDrawerClosed(View drawerView) {
    super.onDrawerClosed(drawerView);

    mAnimationScheduled = true;        

    final RecyclerView recyclerView =
            (RecyclerView) drawerView.findViewById(R.id.drawer_content);
    if (recyclerView != null) {
        recyclerView.setVisibility(View.INVISIBLE);
    }
}

更新:上一个答案不能解决将抽屉拖到中途打开然后关闭的情况,因为如果抽屉没有完全打开,则不会调用onDrawerClosed 为了解决这个问题,我将大部分代码从onDrawerOpen移到了onDrawerSlide()并进行了一些修改。

我遇到了与@ patrick-iv相同的问题,并且想知道其他人如何解决它。 onDrawerStateChanged了将以下代码添加到onDrawerStateChanged侦听器中。

boolean drawerOpen = drawer.isDrawerOpen(GravityCompat.START);
_drawerTopMenu.setVisibility(drawerOpen ? View.VISIBLE : View.INVISIBLE);

if (newState == DrawerLayout.STATE_SETTLING && !drawerOpen)
    _drawerTopMenu.startLayoutAnimation();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM