0

Я создал ящик с использованием DrawerLayout, который содержит RecyclerView с элементами. Я также приложил layoutAnimation к RecyclerView, чтобы предметы приходят со стороны при открытии ящика. Это работает персиковый первый раз, но при открытии ящика второй раз все уже на месте. Я хотел бы, чтобы 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" 
    /> 

ответ

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); 
    } 
} 

Update: предыдущий ответ не обрабатываем случай, когда ящик перетаскивается наполовину открытым и затем закрывается, так как onDrawerClosed не вызывается, если ящик не был полностью открыт. Чтобы решить эту проблему, я переместил большую часть кода из onDrawerOpen в onDrawerSlide() и немного изменил его.

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(); 
Смежные вопросы