如何在自己定制的View的中显示scrollbar?
首先我说的这个scrollbar,指的是滑动view右侧的滚动条,比如RecyclerView、ScrollView等。
scrollbar顾名思义,只有滚动的view才能有这个bar,那问题就来了,如果是我们自定义的一个view,然后有需要在自己的view里面显示自己scrollbar的需求,这该怎么办呢
当时接到这个需求的时候一脸懵逼,无可下手,研究了一番终于小有成就
原理:
首先一个令我惊讶的是View内部早就给我们提供了scrollbar,只是我们平时不用,没显示而已,那怎么显示呢,API提供了一个awakenScrollBars的方法,我们只要调用一下,就显示了,真的很神奇
显示的条件:
必须是一个可以滑动的view,可以滑动很容易理解,那是如何体现在代码中的呢?
![](https://img.haomeiwen.com/i2068419/2f2a0d4f9aa9f5af.png)
我们只要实现了这三个方法,就能代表是可以滑动的,
range、offset、extent这个概念是什么意思呢
![](https://img.haomeiwen.com/i2068419/9e2a1786f654b04a.png)
概念很清晰了,滑动的条件只要range > extent,就可以代表view可以滑动,那offset的范围便是
0 ~(range - extent)。
说了这么多,我直接上demo吧
自定义的view
public class SView extends View {
public SView(Context context) {
super(context);
}
public SView(Context context,AttributeSet attrs) {
super(context,attrs);
}
public SView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context,attrs,defStyleAttr);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 在这里我测试,显示滚动条
awakenScrollBars();
return super.onTouchEvent(event);
}
@Override
protected int computeVerticalScrollExtent() {
return 2000;
}
@Override
protected int computeVerticalScrollOffset() {
return 1000;
}
@Override
protected int computeVerticalScrollRange() {
return 3000;
}
}
现在range是3000,extent是2000,offset的范围就是0 ~ 1000。
xml布局中
<android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:fadeScrollbars="true"/>
(ps:在这里,我仅仅是拿着竖直方向举例子,水平方向同理)
欢迎大家交流
-end
网友评论