[英]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.