在開發(fā)中斑芜,很多情況下,需要自定義滾動條带污,比如要實現如下效果:
實現思路:橫向和縱向列表都是用的RecyclerView体箕,滾動條用ItemDecoration的onDrawOver發(fā)放實現
- 橫向滾動條關鍵代碼如下:
override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
super.onDrawOver(c, parent, state)
//滾動條拇指的水平范圍
val extent=parent.computeHorizontalScrollExtent()
//可滾動的區(qū)域大小
val range=parent.computeHorizontalScrollRange()
//當前偏移量(當前滾動的距離)
val offset=parent.computeHorizontalScrollOffset()
//最大偏移量(最大可滾動的距離)
val maxOffset=range-extent
//可以滑動時,在繪制
if (maxOffset>0){
val startX=parent.width/2-scrollBarLength/2
val startY=parent.height-20f.dp2px()
paint.color=Color.parseColor("#f2f2f2")
c.drawLine(startX,startY,startX+scrollBarLength,startY,paint)
paint.color=Color.parseColor("#ff0000")
val ratio=offset.toFloat()/maxOffset.toFloat()
val offsetY=ratio*(scrollBarLength-indicatorLength)
c.drawLine(startX+offsetY,startY,startX+indicatorLength+offsetY,startY,paint)
}
- 縱向滾動條關鍵代碼如下:
override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
super.onDrawOver(c, parent, state)
//滾動條拇指的垂直范圍
val extent=parent.computeVerticalScrollExtent()
//可滾動的區(qū)域大小
val range=parent.computeVerticalScrollRange()
//當前偏移量(當前滾動的距離)
val offset=parent.computeVerticalScrollOffset()
//最大偏移量(最大可滾動的距離)
val maxOffset=range-extent
//可以滑動時杈笔,在繪制
if (maxOffset>0){
val startX=parent.width-10f.dp2px()
val startY=parent.height/2f-scrollBarLength/2f
paint.color=Color.parseColor("#f2f2f2")
c.drawLine(startX,startY,startX,startY+scrollBarLength,paint)
paint.color=Color.parseColor("#ff0000")
val ratio=offset.toFloat()/maxOffset.toFloat()
val offsetY=ratio*(scrollBarLength-indicatorLength)
c.drawLine(startX,startY+offsetY,startX,startY+indicatorLength+offsetY,paint)
}