progressBar实现recyclerView横向指示器(类似支付宝、淘宝某些页面的指示器)

    技术2022-07-11  107

    主要实现思路就是在recyclerview滑动的时候不断计算滑动的距离,用当前已滑动的距离/总长度即为当前recyclerview的滑动百分比,用progressBar(seekBar也可以)显示百分比即可,主要代码如下:

    private ProgressBar progressIndicator; private float scrollX; private float percentage; private int totalDistanceX; m_rv_scenic.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { int xOffset = m_rv_scenic.computeHorizontalScrollOffset(); int range = m_rv_scenic.computeHorizontalScrollRange(); int extent = m_rv_scenic.computeHorizontalScrollExtent(); totalDistanceX = range - extent; if (percentage == 0)//记录上一次的滑动百分比 percentage = xOffset * 1f / totalDistanceX; scrollX = percentage * totalDistanceX + dx; if (xOffset == 0) scrollX = 0; if (xOffset == totalDistanceX) scrollX = xOffset; percentage = scrollX / totalDistanceX; //此处并不能获取rv的精准滑动距离 先这样 progressIndicator.setMax(totalDistanceX); progressIndicator.setProgress((int) scrollX + totalDistanceX / 8); super.onScrolled(recyclerView, dx, dy); } });

    progressBar样式:

    <ProgressBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="60dp" android:layout_height="3dp" android:layout_marginTop="5dp" android:progressDrawable="@drawable/progress_indicator" /> @drawable/progress_indicator <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/progress_bg"> <shape> <corners android:radius="10dp" /> <solid android:color="#D8DAF3" /> </shape> </item> <item android:id="@+id/progress"> <clip> <shape> <corners android:radius="10dp" /> <gradient android:angle="0" android:endColor="#B48BED" android:startColor="@color/main_color" /> </shape> </clip> </item> </layer-list>

    效果图:

    当然,这个方式在数据量少(一屏内能展示)的情况可以精准计算百分比,当需要翻页的时候便不能精准计算百分比了(就像滑动页面的时候scrollBar长短会不断变化),此时如果需要精确获取百分比,可以通过计算每个item的宽度从而计算出整个recyclerview的宽度进而得到百分比。 我的业务场景不需要这么精准,所以就先这么实现 另,不能精准获取百分比的原因我还没找到,各位懂的欢迎评论告知~

    Processed: 0.012, SQL: 9