最近一直在用Android TV的RecyclerView,实现视频搜索列表卡片的滚动显示,因为采用了双排滚动,打破了系统默认的单排滚动,且每一屏幕显示10个完整卡片5个半漏边卡片,每一个完整卡片的左下角有个数字角标(1~10),经过语音说出数字角标后可以打开对应的卡片节目。RecyclerView的双排滚动着实麻烦,由于打破了原有的机制,连续滚动过程当中常常会出现焦点乱跳或者丢失以及显示错位等等问题。因为滚动要严格保持对齐且要配合语音识别位置,这其中设计到不少关联细节。这里只记录view的边界测量,通过对比测试,确实颇有效。ide
1、关于屏幕绝对坐标,getLocationOnScreen与getLocationInWindow测试
View.getLocationInWindow(int[] location) <-> 一个控件在其父窗口中的坐标位置spa
View.getLocationOnScreen(int[] location) <-> 一个控件在其整个屏幕上的坐标位置.net
getLocationInWindow : 计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标设计
getLocationOnScreen: 计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标3d
getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父亲里的坐标。视频
注意其参数location:blog
int[] location = new int[2] ;get
location [0]--->x坐标,location [1]--->y坐标io
2、关于滚动距离偏移计算:
(1)computeVerticalScrollOffset():已经向下滚动的距离,为0时表示已处于顶部。
(2)computeVerticalScrollRange():总体的高度,注意是总体,包括在显示区域以外的。
(3)computeVerticalScrollExtent():显示区域的高度。
图示以下:
当Offset大于0时,显示区域能够继续上移(PageUP或KeyUp,即view可继续下拉),当Offset等于0时,不能够继续上移。
当Range大于Offset加上Extent时,显示区域能够继续下移(PageDown或KeyDown, 即view能够继续上拉),当Range等于Offset加上Extent时,不能够下移。
(能够看到上面判断上拉时多减了一个1,是由于计算过程当中有些float和int的转换,多减个1是为了保险起见,最多也就是吃掉view一个像素的高度而已)
计算滚动到最底部的方法,示例:
public boolean isSlideToBottom() {
if (computeVerticalScrollExtent() + computeVerticalScrollOffset()
>= computeVerticalScrollRange())
return true;
return false;
}