预览
思路
纵向的RecyclerView完全没有难度,主要是指示器(IndicatorView)的动画,下面主要说IndicatorView的实现
1. TranslationY
动画:由初始位置滑动到点击的当前位置
ObjectAnimator animator = ObjectAnimator.ofFloat(this, "TranslationY", oldY, newY);
animator.setDuration(500);
animator.setInterpolator(new OvershootInterpolator());
animator.start();
- 获取当前位置:RecyclerView点击的时候可以获取当前点击的View,有View就可以拿到位置信息。
- 获取初始位置,就是第0个View的位置。如果只是简单的
recyclerView.getLayoutManager().findViewByPosition(0)
,得到的View=null,尴尬不?
这是因为在获取的时候RecyclerView并没有加载完成,所以这个问题就转换成了RecyclerView什么时候加载完成。这就好说了吧,代码如下。
recyclerView.post(new Runnable() {
@Override
public void run() {
}
});
计算滑动距离
private float calculateViewCenter(View view) {
int tabHeight = getMeasuredHeight();
int viewHeight = view.getHeight();
int viewTop = view.getTop();
return 1f * (viewTop + viewHeight / 2 - tabHeight / 2);
}
Activity代码
recyclerView.post(new Runnable() {
@Override
public void run() {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
View child = manager.findViewByPosition(0);
if (child != null) {
indicatorView.openAnimator(child);
}
}
});
}
});
代码
下载代码
下载的代码中有一部分有错,需要自己更改一下。