最近一直在用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;
}

Android View 滚动边界的测量的更多相关文章

  1. android View的测量和绘制

    本篇内容来源于android 群英传(徐易生著) 我写到这里,是觉得徐易生讲的确实很好, 另外加入了一些自己的理解,便于自己基础的提高. 另外参考:http://www.gcssloop.com/cu ...

  2. Android View 如何测量

    对于Android View的测量,我们一句话总结为:"给我位置和大小,我就知道您长到那里". 为了让大家更好的理解这个结论,我这里先讲一个日常生活中的小故事:不知道大家玩过&qu ...

  3. Android view的测量及绘制

    讲真,自我感觉,我的水平真的是渣的一匹,好多东西都只停留在知道和会用的阶段,也想去研究原理和底层的实现,可是一看到代码就懵逼了,然后就看不下去了, 说自己不着急都是骗人的,我自己都不信,前两天买了本& ...

  4. Android View 测量流程(Measure)完全解析

    前言 上一篇文章,笔者主要讲述了DecorView以及ViewRootImpl相关的作用,这里回顾一下上一章所说的内容:DecorView是视图的顶级View,我们添加的布局文件是它的一个子布局,而V ...

  5. Android Scroller简单用法 --View滚动

    转:http://ipjmc.iteye.com/blog/1615828 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中 ...

  6. Android View的绘制流程

    写得太好了,本来还想自己写的,奈何肚里墨水有限,直接转吧.正所谓前人种树,后人乘凉.. View的绘制和事件处理是两个重要的主题,上一篇<图解 Android事件分发机制>已经把事件的分发 ...

  7. [转]Android View.onMeasure方法的理解

    转自:http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html Android View.onMeasure方法的理解 View在屏幕上显示出来要先经过 ...

  8. Android View框架总结(五)View布局流程之Layout

    转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52216195 View树的Layout流程 View的Layout时序图 View布局 ...

  9. android.view.View

    * This class represents the basic building block for user interface components. A View * occupies a ...

随机推荐

  1. jQuery+ localStorage 实现一个简易的计时器

    原型 图片发自简书App 需求1.关闭浏览器时时间继续运行2.刷新时保持当前状态3.结束时间保存在客户端 <div class="wrapper"> <div c ...

  2. layer弹框在实际项目中的一些应用

    官方介绍:layer至今仍作为layui的代表作,受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力.目前,l ...

  3. javaScript显示实时时间输出

    实时时间输出 <script> function getDateTime(){ var a = new Date(); var year = a.getFullYear(); var mo ...

  4. 检索 04 --Stack栈 Queue队列 Hashtable哈希表

    //Stack 先进后出 没有索引 Stack st = new Stack(); st.Push(12); st.Push(11); st.Push(22); st.Push(34); st.Pus ...

  5. Swift语言实现代理传值

    需求:利用代理实现反响传值(下面样例採用点击第二个视图控制器中的button来改变第一个视图控制器中的Label的内容) 一.创建RootViewController import Foundatio ...

  6. Android菜鸟的成长笔记(21)——跨进程调用Service

    我们都知道在Android中的每一个应用是一个进程,其实每一个应用就相当于Linux系统里面的一个用户,进程和进程之间的通信其实就相当于用户和用户之间的通信,为了实现这种跨进程通信,Android提供 ...

  7. matlab、sklearn 中的数据预处理

    数据预处理(normalize.scale) 0. 使用 PCA 降维 matlab: [coeff, score] = pca(A); reducedDimension = coeff(:,1:5) ...

  8. 浏览器加载js文件顺序

    在默认情况下,下载和执行js都会阻塞页面的渲染,当然现在浏览器支持并行下载,但仍然会阻塞图片等的下载和渲染,所以通常建议把js文件放body底.对于执行顺序,不管是外部js还是内部,只要 遇到< ...

  9. 【21.21%】【codeforces round 382D】Taxes

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  10. MapReduce 编程 系列七 MapReduce程序日志查看

    首先,假设须要打印日志,不须要用log4j这些东西,直接用System.out.println就可以,这些输出到stdout的日志信息能够在jobtracker网站终于找到. 其次,假设在main函数 ...