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时,显示区域可以继续上移(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;
}
Android View 滚动边界的测量的更多相关文章
- android View的测量和绘制
本篇内容来源于android 群英传(徐易生著) 我写到这里,是觉得徐易生讲的确实很好, 另外加入了一些自己的理解,便于自己基础的提高. 另外参考:http://www.gcssloop.com/cu ...
- Android View 如何测量
对于Android View的测量,我们一句话总结为:"给我位置和大小,我就知道您长到那里". 为了让大家更好的理解这个结论,我这里先讲一个日常生活中的小故事:不知道大家玩过&qu ...
- Android view的测量及绘制
讲真,自我感觉,我的水平真的是渣的一匹,好多东西都只停留在知道和会用的阶段,也想去研究原理和底层的实现,可是一看到代码就懵逼了,然后就看不下去了, 说自己不着急都是骗人的,我自己都不信,前两天买了本& ...
- Android View 测量流程(Measure)完全解析
前言 上一篇文章,笔者主要讲述了DecorView以及ViewRootImpl相关的作用,这里回顾一下上一章所说的内容:DecorView是视图的顶级View,我们添加的布局文件是它的一个子布局,而V ...
- Android Scroller简单用法 --View滚动
转:http://ipjmc.iteye.com/blog/1615828 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中 ...
- Android View的绘制流程
写得太好了,本来还想自己写的,奈何肚里墨水有限,直接转吧.正所谓前人种树,后人乘凉.. View的绘制和事件处理是两个重要的主题,上一篇<图解 Android事件分发机制>已经把事件的分发 ...
- [转]Android View.onMeasure方法的理解
转自:http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html Android View.onMeasure方法的理解 View在屏幕上显示出来要先经过 ...
- Android View框架总结(五)View布局流程之Layout
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52216195 View树的Layout流程 View的Layout时序图 View布局 ...
- android.view.View
* This class represents the basic building block for user interface components. A View * occupies a ...
随机推荐
- c#代码01--控制台的简单输入与输出及日期的格式输出
/* 使用ReadLine()完成控制台的输入输出内容 */ using System; namespace Test { class Test1 { static void Main(string[ ...
- radio实现第一次点击选中第二次点击取消
Jquery代码如下: $("#add_form .radio input").bind("click",function(){ var $radio = $( ...
- 【t095】拯救小tim
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小tim在游乐场,有一天终于逃了出来!但是不小心又被游乐场的工作人员发现了... 所以你的任务是安全地 ...
- zookeeper 半数可用/选举机制
1.半数可用机制,半数可用指的是zk集群中一半以上的机器正常时集群才能正常工作 已经启动了hadoop002(follower),hadoop003(leader) 下面停止hadoop002 在ha ...
- 微信支付-公众号支付H5调用支付详解
微信公众号支付 最近项目需要微信支付,然后看了下微信公众号支付,,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验. 一. ...
- MapReduce自定义InputFormat,RecordReader
MapReduce默认的InputFormat是TextInputFormat,且key是偏移量,value是文本,自定义InputFormat需要实现FileInputFormat,并重写creat ...
- 查询系统状态 内存大小 cpu信息 设备负载情况
1.1 查看内存状态 /proc/meminfo里面存放着内存的信息 查看内存命令(包括虚拟内存swap): free -h (低版本系统可能不支持-h) 或者 free -m (以mb单位显示) a ...
- Swift 中的Closures(闭包)详解
Swift 中的Closures(闭包)详解 在Swift没有发布之前,所有人使用OC语言编写Cocoa上的程序,而其中经常被人们讨论的其中之一 -- Block 一直备受大家的喜爱.在Swift中, ...
- 转载:Adb远程连接Android系统(通过网络使用ADB(Connect to android with wifi))
本文介绍如何通过网络(尤指无线网络)与Android的adbd进行连接.原理:adb server: 计算机上的一个服务进程,进程名为adbadb daemon: Android 手机上的一个服务进程 ...
- Like关系查询
比如:有表1.表2两张相,希望通过like进行关联查询 // mysql中使用concat连接字符串 select t1.id, t1.title, t2.keyword from t1 inner ...