1、概述
android tv 的ui 很细。 很细就会涉及到的一些ui 元素 需要自己 写
这里记录下坐标的获取
2、指定view 的坐标(绝对坐标)获取 的四个方法
2.1 view.getLocationInWindow(int[2]) |
|
|
返回view左上角的坐标,该坐标是包含了状态栏标题栏的高度(tv没有状态栏) |
2.2 view.getLocationOnScreen(int[2]) |
|
|
该方法效果与上面类似,没有使用 |
2.3 view.getGlobalVisibleRect |
|
|
简单的理解就是 整个屏幕的可见范围内的 canvas的坐标 (包含各种栏) 比如720p 的屏幕。 rect.right <= 1280 rect.bottom<= 720 (屏幕打横着放) 其实是小于ViewGroup的边界值 |
2.4 view.getLocalVisibleRect |
|
|
用来判断 view 是否可见,是局部可见还是部分可见很方便 获得的Rect 为相对自己的可视范围区域。 Rect rect = new Rect(); boolean reval = view.getLocalVisibleRect(rect); reval:当可视rect为empty的时候 返回false,也就是view 完全不可见的时候(一个角都看不到) rect 相对自己右上角顶点是[0,0] 左下角的是[w,h] 有局部不可见的时候 对应取看的到的值相对右上角顶点(0,0)的偏移量 可见区域内:true [0, 0, width, height] 左边被遮挡:true [x,y,w,h] 右边被遮挡:true [0,0,x4,y4] 全部被遮挡:false [0,0,0,0] gone false [0,0,0,0] 效果图如下:
|
判断是否局部可见,用rect[right, top, left, bottom]判断
left >0 view左边在可视屏幕外 (或者父布局范围外看不到的地方)
top >0 view上边在可视屏幕外
right< width view右边在可视屏幕外
bottom < height view下边在可视屏幕外
view.getLocationInWindow(int[2])
返回左上角的坐标,该坐标是包含了状态栏标题栏的高度(tv没有状态栏),可以认为是整个屏幕的canvas的绝对坐标。(注canvas可以认为没用边界)
在可见范围之外 依旧可以读到该值。比如local[0] = 3999 表示屏幕外
在自定义ViewGroup时计算子View 是否在可见区域内时就要用该坐标判断
view.getGlobalVisibleRect
简单的理解就是 整个屏幕的可见范围内的 canvas的坐标 (当然就是包含各种栏)
比如720p 的屏幕。 rect.right < 1280 rect.bottom< 720 (屏幕打横着放) 其实是小于ViewGroup的边界值
ps:把这两个方法 getLocationInWindow getGlobalVisibleRect 用着,加上getWidth getHeight 可以满足屏幕和 容器子view 定位,判断view是否在ViewGroup的边界 。
3、判断ViewGroup 内的子view 是否在ViewGroup的可视范围边界内(2.3的方法更方便是后来补充上来的)
//viewGroup
Rect visibleRect = new Rect();
getGlobalVisibleRect(visibleRect);
//view
Rect focusVisibleRect = new Rect();
view.getGlobalVisibleRect(focusVisibleRect);
int[] focusL = new int[2];
view.getLocationInWindow(focusL);
3.1在右边(一部分在右边,和全部在右边 已经处理了边界值)
if ((focusL[0] + view.getWidth()) > visibleRect.right) {
3.2在左边(一部分在左边和全部在左边 已经处理了边界值)
if ((focusL[0]) < visibleRect.left) {
3.3全部在右边:
focusL[0] > visibleRect.right
3.4一部分在右边 (不能避免的一个临界 视图结尾刚好卡到focusVisibleRect.right)
if (visibleRect.right == focusVisibleRect.right)
3.5在左边的方式 类比于右边
4、指定View 的 相对坐标 相对于上级的ViewGroup 坐标
view 可以获取到自身在viewGroup中的上下左右4个点的位置
如上图
view 的 top left right bottom四个点的位置 可以用get方法得到(也就是其对应viewGroup的相对坐标)
view.getTop
view.getBottom
view.getRight
view.getLeft
对于3中的 view 用这些函数取到的top left right 就是该view相对于viewgroup的绝对坐标了,在自定义滑块滑动距离的时候可以用到