android 坐标获取与计算

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]

效果图如下:



判断是否完全不可见用reval值判断

判断是否局部可见,用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的绝对坐标了,在自定义滑块滑动距离的时候可以用到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值