悬浮效果
先看个效果这是一个City
列表,每个City
都有所属的Province
,需要在滑动的时候,将对应的Province
悬浮在顶部。悬浮顶部的Province需要根据列表的滑动而适当改变位置,实现“顶上去”的效果。
实现思路:
- 利用
RecyclerView.ItemDecoration
绘制Province
(就像绘制分割线一样) - 同一组的
City
,只绘制一个Province
- 计算偏移,将当前
Province
固定在顶部 - 根据列表滑动,实现偏移效果
ItemDecoration
既然是利用RecyclerView.ItemDecoration
实现的悬浮效果,那么有必要了解下它。 ItemDecoration
字面意思:Item
的装饰。是的!是装饰!不只是画分割线。 其实ItemDecoration
的功能非常强大,而我们平时只是用它来实现分割线的效果(至少我是这样)。因此,可能很多同学认为ItemDecoration
就是用来绘制分割线的。其实不然,ItemDecoration
的功能远不止是分割线的绘制。
先看下RecyclerView.ItemDecoration
的源码(部分):
-
public static abstract class ItemDecoration {
-
...
-
public void onDraw(Canvas c, RecyclerView parent, State state) {
-
onDraw(c, parent);
-
}
-
public void onDrawOver(Canvas c, RecyclerView parent, State state) {
-
onDrawOver(c, parent);
-
}
-
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
-
getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),
-
parent);
-
}
-
}
里面是我们常用的三个方法:
-
getItemOffsets
:通过Rect
为每个Item
设置偏移,用于绘制Decoration
。 -
onDraw
:通过该方法,在Canvas
上绘制内容,在绘制Item
之前调用。(如果没有通过getItemOffsets
设置偏移的话,Item
的内容会将其覆盖) -
onDrawOver
:通过该方法,在Canvas
上绘制内容,在Item
之后调用。(画的内容会覆盖在item的上层)
RecyclerView
的背景、onDraw
绘制的内容、Item
、onDrawOver
绘制的内容,各层级关系如下:
资源均来自第三方,谨慎下载,前往第三方网站下载