2016-09-23 2 views
3

Я использую следующий код для переключения слайда/слайда для AppBarLayout.ViewPropertyAnimator - анимация не произойдет в первый раз

public void showToolbar(boolean show) { 
    if (appBar == null) { 
     Log.e(TAG, "showToolbar: Toolbar is null"); 
     return; 
    } 
    boolean toolbarShown = Utils.isViewVisible(appBar); 
    Log.d(TAG, "showToolbar: shown:" +shown); 
    boolean changed = (show != toolbarShown); 
    if (changed) { 
     if (show) { 
      Log.d(TAG, "showToolbar: showing"); 
      appBar.setVisibility(View.VISIBLE); 
      appBar.animate() 
        .translationY(0) 
        .setInterpolator(new DecelerateInterpolator()) 
        .setListener(new Animator.AnimatorListener() { 
         @Override 
         public void onAnimationStart(Animator animator) { 
          appBar.setVisibility(View.VISIBLE); 
         } 

         @Override 
         public void onAnimationEnd(Animator animator) { } 

         @Override 
         public void onAnimationCancel(Animator animator) { } 

         @Override 
         public void onAnimationRepeat(Animator animator) { } 
        }) 
        .start(); 
     } else { 
      Log.d(TAG, "showToolbar: hiding"); 
      appBar.animate() 
        .translationY(-toolbar.getBottom()) 
        .setInterpolator(new DecelerateInterpolator()) 
        .setListener(new Animator.AnimatorListener() { 
         @Override 
         public void onAnimationStart(Animator animator) { } 

         @Override 
         public void onAnimationEnd(Animator animator) { 
          appBar.setVisibility(View.INVISIBLE); 
         } 

         @Override 
         public void onAnimationCancel(Animator animator) { } 

         @Override 
         public void onAnimationRepeat(Animator animator) { } 
        }) 
        .start(); 
     } 
    } else { 
     Log.d(TAG, "showToolbar: no change"); 
    } 
} 

анимация отлично работает в первый раз showToolbar(true) за исключением называется, чтобы показать панель инструментов. Впервые представление отображается без анимации. Я просмотрел сайт и нашел похожие вопросы, но решения, похоже, не работают для меня.

Возможно, стоит отметить, что это происходит только тогда, когда мы хотим сначала спрятать appBar. Я думаю, что, возможно, для анимации

Update 1:

public static boolean isViewVisible(View view) { 
    if (View.VISIBLE == view.getVisibility()) return true; 
    else return false; 
} 

Update 2

Я удалил isViewWithinScreenBounds() метод, потому что проверка на самом деле не нужны.

+0

Можете ли вы обеспечить выполнение следующих способов: Utils.isViewWithinScreenBounds, Utils.isViewVisible – Rzodkiewka

+0

Может быть, попытаться поставить showToolbar (истинный) в методе onCreateOptionsMenu (..) – Rzodkiewka

+0

@Rzodkiewka не работает. Без изменений. –

ответ

1

Обязательно установить начальные значения для visibility и translationY.

Если вы хотите, чтобы ваша панель инструментов быть изначально скрыты и появляются с первой анимацией, обязательно установите android:visibility="invisible" и НЕ"gone", и отрицательные android:translationY как -56dp.

+0

Спасибо. Вы были так полезны в чате. Я могу наградить щедростью за 22 часа. –

+0

Я рад, что помогу вам, ура! –

1

Попробуйте с этим

<android.support.design.widget.AppBarLayout 
    android:id="@+id/app_bar" 
    android:layout_width="match_parent" 
    android:translationY="-120dp" 
    android:layout_height="120dp"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="SOME TEXT HERE" /> 
    </android.support.v7.widget.Toolbar> 
</android.support.design.widget.AppBarLayout> 

код активность

@BindView(R.id.app_bar) 
AppBarLayout appBar; 
@BindView(R.id.toolbar) 
Toolbar toolbar; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.some_layout); 
    ButterKnife.bind(this); 

    setSupportActionBar(toolbar); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      animateToolbar(false); //Just for testing purpose - delay execute of function animateToolbar() for 4 seconds 
     } 
    }, 4000); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    animateToolbar(true); 
    return super.onCreateOptionsMenu(menu); 
} 

private void animateToolbar(boolean show) { 

    if (show) { 
     // As you can see in the xml layout initial position of the appBar is translated by its height to the top of the screen "-" sign 
     // Slide int from out of the screen to initial position -> from -120 dp (height of the app bar, see xml) to 0 dp 
     appBar.animate() 
       .translationY(0) 
       .setDuration(1000) 
       .start(); 

    } else { 
     // Slide out from initial position to the top of the screen -> from 0 dp to -120 dp (height of the app bar, see xml) 
     appBar.animate() 
       .translationY(-appBar.getHeight()) 
       .setDuration(1000) 
       .start(); 
    } 
} 
+0

Пожалуйста, объясните, что вы здесь делаете. –

+0

Я добавил комментарии к коду – Rzodkiewka

Смежные вопросы