实现底部栏动态跟随列表显示隐藏
// 动画工具类
public class AnimatorUtil {
private static LinearOutSlowInInterpolator FAST_OUT_SLOW_IN_INTERPOLATOR = new LinearOutSlowInInterpolator();
private static AccelerateInterpolator LINER_INTERPOLATOR = new AccelerateInterpolator();
/**
* 显示view
*
* @param view View
* @param viewPropertyAnimatorListener ViewPropertyAnimatorListener
*/
public static void scaleShow(View view, ViewPropertyAnimatorListener viewPropertyAnimatorListener) {
view.setVisibility(View.VISIBLE);
ViewCompat.animate(view)
.scaleX(1.0f)
.scaleY(1.0f)
.alpha(1.0f)
.setDuration(800)
.setListener(viewPropertyAnimatorListener)
.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR)
.start();
}
/**
* 隐藏view
*
* @param view View
* @param viewPropertyAnimatorListener ViewPropertyAnimatorListener
*/
public static void scaleHide(View view, ViewPropertyAnimatorListener viewPropertyAnimatorListener) {
ViewCompat.animate(view)
.scaleX(0.0f)
.scaleY(0.0f)
.alpha(0.0f)
.setDuration(800)
.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR)
.setListener(viewPropertyAnimatorListener)
.start();
}
/**
* 显示view
*
* @param view View
* @param viewPropertyAnimatorListener ViewPropertyAnimatorListener
*/
public static void translateShow(View view, ViewPropertyAnimatorListener viewPropertyAnimatorListener) {
if (view.getVisibility()==View.VISIBLE){
return;
}
view.setVisibility(View.VISIBLE);
ViewCompat.animate(view)
.translationY(0)
.setDuration(400)
.setListener(viewPropertyAnimatorListener)
.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR)
.start();
}
/**
* 隐藏view
*
* @param view View
* @param viewPropertyAnimatorListener ViewPropertyAnimatorListener
*/
public static void translateHide(View view, ViewPropertyAnimatorListener viewPropertyAnimatorListener) {
if (view.getVisibility()==View.GONE){
return;
}
view.setVisibility(View.GONE);
ViewCompat.animate(view)
.translationY(360)
.setDuration(400)
.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR)
.setListener(viewPropertyAnimatorListener)
.start();
}
}
然后就是页面代码
LinearLayout bootomView=findByid(R.id.xx)
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull final RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// 第一种,直接取消动画
RecyclerView.ItemAnimator animator = mRecyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}
mRecyclerView.getItemAnimator().setChangeDuration(0);
}
@Override
public void onScrolled(@NonNull final RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
Log.e("tag", "当前滚动状态:" + recyclerView.getScrollState() + "当前位置:" + dy);
//上滑
if (dy > 0) {
getActivity().runOnUiThread(() -> {
AnimatorUtil.translateHide(bootomView, null);
});
} else if (dy < -1) {
//下滑
getActivity().runOnUiThread(() -> {
AnimatorUtil.translateShow(bootomView, null);
});
}
//底部数据特效
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int childCount = layoutManager.getChildCount();
//对每个item进行初始化
for (int i = 0; i < childCount; i++) {
layoutManager.getChildAt(i).setAlpha(1);
layoutManager.getChildAt(i).setScaleY(1);
layoutManager.getChildAt(i).setScaleX(1);
}
new ThreadPoolUtils().ioExecutor.execute(() -> {
calculateAlphaAndScale(recyclerView, layoutManager);
});
}
});
// 底部数据动态缩放模糊动画效果
private void calculateAlphaAndScale(RecyclerView recyclerView, LinearLayoutManager layoutManager) {
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstItemPosition = manager.findFirstVisibleItemPosition();
int lastItemPosition = manager.findLastVisibleItemPosition();
View lastView = manager.getChildAt(lastItemPosition - firstItemPosition);
if (lastView != null) {
int itemHeight = lastView.getHeight();
int visibleHeight = recyclerView.getHeight() - lastView.getTop();
if (visibleHeight < 0) {
return;
}
float ratio = visibleHeight * 1.0f / itemHeight;
if (ratio > 1.0) {
return;
}
lastView.setAlpha(ratio);
float scale = 0.9f;
float scaleFactor = scale + (1 - scale) * ratio;
lastView.setScaleX(scaleFactor);
lastView.setScaleY(scaleFactor);
}
}