在做項目時想增加點動感,於是就有如下效果:
實現起來也很簡單,通過屬性動畫和recyclerview 滑動結合就很好實現了。
通過給recycleview添加一個滑動監聽:通過滾動的差值來處理動畫
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (dy > 0 ){ hidenFabAnim(); }else{ showFabAnim(); } } });
兩個動畫如下:
/** * 動畫隱藏浮動按鈕 */ private void hidenFabAnim() { if (!isFabAnimg && mActionButton != null && mActionButton.getVisibility() == View.VISIBLE) { Animator animator = ObjectAnimator.ofFloat(mActionButton, "translationY", 0f, 100f); animator.setDuration(500); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { isFabAnimg = true; } @Override public void onAnimationEnd(Animator animation) { isFabAnimg = false; mActionButton.setVisibility(View.GONE); } @Override public void onAnimationCancel(Animator animation) { isFabAnimg = false; } @Override public void onAnimationRepeat(Animator animation) { } }); animator.start(); } } /** * 動畫顯示浮動按鈕 */ private void showFabAnim(){ if (mActionButton != null && !isFabAnimg && mActionButton.getVisibility() == View.GONE) { Animator animator = ObjectAnimator.ofFloat(mActionButton,"translationY",100f,0f); animator.setDuration(500); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { isFabAnimg = true; } @Override public void onAnimationEnd(Animator animation) { isFabAnimg = false; } @Override public void onAnimationCancel(Animator animation) { isFabAnimg = false; } @Override public void onAnimationRepeat(Animator animation) { } }); mActionButton.setVisibility(View.VISIBLE); animator.start(); } }
動畫中給定了移出屏幕和顯示在屏幕的距離是100,這個值並不是那么確定性,項目中需要通過屏幕密度來算這個值的大小,以便適應更好的滑動效果;定義了個
isFabAnimg 變量,用來明確動畫的狀態,避免了重復執行顯示或者隱藏的動畫。
可見android中要實現某些小效果還是非常的方便的