0

我使用 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"
    />
4

2 回答 2

1

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

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如果抽屉没有完全打开,则不会调用。为了解决这个问题,我将大部分代码从onDrawerOpento移动onDrawerSlide()并稍作修改。

于 2015-10-28T11:03:05.433 回答
0

我和@patrick-iv 有同样的问题,想知道其他人是如何解决的。我想出了将以下代码添加到onDrawerStateChanged侦听器。

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

if (newState == DrawerLayout.STATE_SETTLING && !drawerOpen)
    _drawerTopMenu.startLayoutAnimation();
于 2017-05-23T22:01:19.297 回答