Android View 滚动边界的测量

最近一直在用Android TV的RecyclerView,实现视频搜索列表卡片的滚动显示,由于采用了双排滚动,打破了系统默认的单排滚动,且每一屏幕显示10个完整卡片5个半漏边卡片,每个完整卡片的左下角有个数字角标(1~10),通过语音说出数字角标后能够打开对应的卡片节目。RecyclerView的双排滚动着实麻烦,因为打破了原有的机制,连续滚动过程中经常会出现焦点乱跳或者丢失以及显示错位等等问题。由于滚动要严格保持对齐且要配合语音识别位置,这其中设计到很多关联细节。这里只记录view的边界测量,经过对比测试,确实很有效。

一、关于屏幕绝对坐标,getLocationOnScreen与getLocationInWindow

View.getLocationInWindow(int[] location)  <-> 一个控件在其父窗口中的坐标位置

View.getLocationOnScreen(int[] location) <-> 一个控件在其整个屏幕上的坐标位置

getLocationInWindow : 计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标

getLocationOnScreen:  计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标

getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父亲里的坐标。

注意其参数location:

int[] location = new  int[2] ;

location [0]--->x坐标,location [1]--->y坐标

二、关于滚动距离偏移计算: 

(1)computeVerticalScrollOffset():已经向下滚动的距离,为0时表示已处于顶部。

(2)computeVerticalScrollRange():整体的高度,注意是整体,包括在显示区域之外的。

(3)computeVerticalScrollExtent():显示区域的高度。

图示如下: 

当Offset大于0时,显示区域可以继续上移(PageUPKeyUp,即view可继续下拉),当Offset等于0时,不可以继续上移。

当Range大于Offset加上Extent时,显示区域可以继续下移(PageDownKeyDown, 即view可以继续上拉),当Range等于Offset加上Extent时,不可以下移。

(可以看到上面判断上拉时多减了一个1,是因为计算过程中有些float和int的转换,多减个1是为了保险起见,最多也就是吃掉view一个像素的高度而已)

计算滚动到最底部的方法,示例:

public boolean isSlideToBottom() {
if (computeVerticalScrollExtent() + computeVerticalScrollOffset()
>= computeVerticalScrollRange())
return true;
return false;
}

posted on 2018-10-11 10:46  Johnny9  阅读(1710)  评论(0编辑  收藏  举报

导航