RecyclerView实现纵向导航栏(获取RecyclerView第一个View)

预览

预览

思路

纵向的RecyclerView完全没有难度,主要是指示器(IndicatorView)的动画,下面主要说IndicatorView的实现
1. TranslationY动画:由初始位置滑动到点击的当前位置

ObjectAnimator animator = ObjectAnimator.ofFloat(this, "TranslationY", oldY, newY);
        animator.setDuration(500);
        animator.setInterpolator(new OvershootInterpolator());
        animator.start();
  1. 获取当前位置:RecyclerView点击的时候可以获取当前点击的View,有View就可以拿到位置信息。
  2. 获取初始位置,就是第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);
                        }
                    }
                });
            }
        });

代码

下载代码
下载的代码中有一部分有错,需要自己更改一下。

猜你喜欢

转载自blog.csdn.net/luckkissmo/article/details/80257916