文章目录

  • I . View 坐标体系总结
  • II . View 组件的 left , top , right , bottom 父容器相对位置
  • III . View 组件的 x , y , translationX , translationY 属性
  • IV . View 组件 窗口坐标 属性
  • V . View 组件 屏幕坐标 属性
  • VI . View 组件的触摸位置 属性
  • VII . View 坐标获取 0 的解决方案

I . View 坐标体系总结


left , top , right , bottom 是组件相对于父容器的位置 , 该值一般不会改变 ;

x , y 是组件当前相对于父容器的位置 ;

translationX , translationY 分别是相对于 left , top 值的偏移大小 ;

left + translationX = x , top + translationY = y ;

窗口坐标获取 : getLocationInWindow ;

屏幕坐标获取 : getLocationOnScreen ;

触摸坐标 : x , y 触摸坐标是相对于组件的坐标 , rawX , rawY 是相对于屏幕的坐标 ;

II . View 组件的 left , top , right , bottom 父容器相对位置


1 . View 组件的基础位置 : left , top , right , bottom 是 View 组件的最基本的位置属性 , 其作用是 描述该组件相对于父容器的位置 ;

2 . 相对父容器位置 : 这里特别注意 , left , top , right , bottom 属性 , 是 相对于父容器的位置 , 不是 相对于 Activity 界面位置 , 也不是 相对于屏幕的位置 ;

3 . 属性本质 : left , top , right , bottom , 四个属性本质是坐标值 ;

4 . 父容器 坐标系 及 坐标原点 : 四属性的坐标值原点 (0,0)(0, 0)(0,0) 是父容器的左上角位置 , xxx 轴向右为正 , 向左为负 , yyy 轴向下为正 , 向上为负 ;

5 . 组件基础位置属性 : 组件的基础位置属性是不会改变的 ;

① left 属性 : 组件的左侧 xxx 轴坐标 , 值为左侧距离父容器左侧的长度 , 本组件左上角顶点 , 在父容器坐标系的 xxx 值 ;

② top 属性 : 组件的顶部 yyy 轴坐标 , 值为顶部距离父容器顶部的高度 , 本组件左上角顶点 , 在父容器坐标系的 yyy 值 ;

③ right 属性 : 组件的右侧 xxx 轴坐标 , 值为右侧距离父容器左侧的长度 , 本组件右下角顶点 , 在父容器坐标系的 xxx 值 ;

④ bottom 属性 : 组件的底部 yyy 轴坐标 , 值为底部距离父容器顶部的长度 , 本组件右下角顶点 , 在父容器坐标系的 yyy 值 ;

III . View 组件的 x , y , translationX , translationY 属性


1 . View 组件的当前位置 : x , y , translationX , translationY 是 View 组件的当前位置 , 其作用是 描述当前的实际位置 , 该位置也是相对于父容器的坐标 , 这里要与基础位置区分开 ;

2 . 组件当前位置 属性 : x , y 是当前的位置 , 这个位置会随着 translationX 和 translationY 的值改变而改变 ;

① x : 表示组件左上角当前的实际位置的 x 坐标 , 该坐标是父容器坐标系中的坐标 , 原点是父容器左上角位置 ;

② y : 表示组件左上角当前的实际位置的 y 坐标 , 该坐标是父容器坐标系中的坐标 , 原点是父容器左上角位置 ;

3 . 偏移位置 : translationX , translationY , 是基于基础位置 left , top 的偏移位置 ;

4 . 当前位置 和 偏移位置 的 初始值 : x 的初始值是 left , y 的初始值是 top , translationX 初始值是 0 , translationY 初始值是 0;

5 . View 组件 坐标属性之间的关系 :

① x , left , translationX 关系 :

x=left+translationXx = left + translationX x=left+translationX

② y , top , translationY 关系 :

y=top+translationYy = top + translationY y=top+translationY

6 . 代码分析 :

① View 组件获取 x 属性代码分析 : x 的值 , 由 left 加上 translationX 得到 ;

/*** The visual x position of this view, in pixels. This is equivalent to the* {@link #setTranslationX(float) translationX} property plus the current* {@link #getLeft() left} property.** @return The visual x position of this view, in pixels.*/
@ViewDebug.ExportedProperty(category = "drawing")
public float getX() {return mLeft + getTranslationX();
}

② View 组件获取 y 属性代码分析 : y 的值 , 由 top 加上 translationY 得到 ;

/*** The visual y position of this view, in pixels. This is equivalent to the* {@link #setTranslationY(float) translationY} property plus the current* {@link #getTop() top} property.** @return The visual y position of this view, in pixels.*/
@ViewDebug.ExportedProperty(category = "drawing")
public float getY() {return mTop + getTranslationY();
}

IV . View 组件 窗口坐标 属性


1 . 获取 View 组件窗口坐标 : 这里的窗口指的是 Activity 窗口 ;

① 所在坐标系 : 坐标系的原点 (0,0)(0 ,0)(0,0) 是 Activity 窗口的左上角位置 ;

② 区分屏幕坐标 : Activity 窗口上还有一个状态栏 , 这里要与屏幕坐标系区分开 ;

③ 获取方法 : 调用 View 组件对象的 getLocationInWindow ( ) 方法 , 数组 0 索引是 x 坐标 , 数组 1 索引是 y 坐标 ;

int[] array = new int[2];
surfaceView.getLocationInWindow(array);

V . View 组件 屏幕坐标 属性


1 . 获取 View 组件屏幕坐标 : 这里的屏幕指的是手机屏幕 ;

① 所在坐标系 : 坐标系的原点 (0,0)(0 ,0)(0,0) 是 手机屏幕的左上角位置 ;

② 获取方法 : 调用 View 组件对象的 getLocationOnScreen ( ) 方法 , 数组 0 索引是 x 坐标 , 数组 1 索引是 y 坐标 ;

int[] array = new int[2];
surfaceView.getLocationOnScreen(array);

VI . View 组件的触摸位置 属性


View 组件的触摸事件的位置属性 :

① x , y 相对于组件坐标 : 当触摸组件时 , 从 MotionEvent 事件中获取的 x , y 坐标是 相对于本组件的坐标 , 即坐标系的原点 (0,0)( 0, 0 )(0,0) 是该组件的左上角位置 ;

② rawX , rawY 相对于屏幕坐标 : 从 MotionEvent 事件中获取的 rawX , rawY 坐标 , 是当前触摸点相对于屏幕的坐标 , 即坐标系的原点 (0,0)(0, 0)(0,0) 是屏幕的左上角位置 ;

VII . View 坐标获取 0 的解决方案


1 . 问题描述 : 在获取组件 位置 , 宽高 时 , 经常遇到获取组件的值为 000 的情况 , 这是因为该组件还没有绘制完成 ;

2 . 解决方案 : 获取 ViewTreeObserver , 监听布局树的绘制情况 , 组件绘制时 , 需要测量 ( Measure ) , 摆放 ( Layout ) , 绘制 ( Draw ) , 此时监听的是摆放操作 , 摆放完毕后 , 就可以获取组件的坐标和大小属性 ;

3 . 监听 Layout 代码 :

surfaceView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {//此时可以获取 View 的坐标和大小 , 不为 0}
});

【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )相关推荐

  1. android:ellipsize=end 不起作用,Android应用开发Android TextView关于android:ellipsize=end的一个神奇bug解决方案...

    本文将带你了解Android应用开发Android TextView关于android:ellipsize=end的一个神奇bug解决方案,希望本文对大家学Android有所帮助. 疑惑 今天在开发过 ...

  2. android ble 设备扫描程序,Android应用开发Android 7.0 BLE scan 问题:程序无错但扫描不到BLE设备...

    本文将带你了解Android应用开发Android 7.0  BLE scan 问题:程序无错但扫描不到BLE设备,希望本文对大家学Android有所帮助. < 最近在做毕设,需要几周内从头学起 ...

  3. android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法

    本文将带你了解Android应用开发Android Studio建立Socket连接失败解决方法,希望本文对大家学Android有所帮助. < Android Studio建立Socket连接失 ...

  4. android落下动画,Android应用开发android 购物车小球掉落动画

    本文将带你了解Android应用开发android 购物车小球掉落动画,希望本文对大家学Android有所帮助. 先贴效果图 对自定义View小红球的绘制 public class BallView ...

  5. android baseactivity,Android应用开发Android通过BaseActivity获取到当前启动的Activity名称...

    本文将带你了解Android应用开发Android通过BaseActivity获取到当前启动的Activity名称,希望本文对大家学Android有所帮助. < 在BaseActivity的on ...

  6. android view 点击变暗,Android应用开发Android ImageView点击变暗效果

    本文将带你了解Android应用开发Android ImageView点击变暗效果,希望本文对大家学Android有所帮助. < 自定义ImageView: 在ImageView中setPres ...

  7. android 防止重复启动app,Android应用开发Android 防止启动页面(SplashActivity)被多次启动...

    本文将带你了解Android应用开发Android 防止启动页面(SplashActivity)被多次启动,希望本文对大家学Android有所帮助. 话不多说直接上代码: @Override prot ...

  8. android studio获取数字签名,Android应用开发Android Studio数字签名打包apk图文步骤教程...

    本文将带你了解Android应用开发Android Studio数字签名打包apk图文步骤教程,希望本文对大家学Android有所帮助. Android Studio数字签名打包release版apk ...

  9. android修改用户名和密码错误,Android应用开发Android Studio 修改用户名、密码、URL等操作教程...

    本文将带你了解Android应用开发Android Studio 修改用户名.密码.URL等操作教程,希望本文对大家学Android有所帮助. 修改用户名.密码: 在AndroidStudio的ter ...

  10. android程序突然崩溃如何调试,Android应用开发android 调试崩溃Unable to instantiate application的解决方法...

    本文将带你了解Android应用开发android 调试崩溃Unable to instantiate application的解决方法,希望本文对大家学Android有所帮助. 更新后Android ...

最新文章

  1. sqlite3源码编译到Android,实现SQLite跨全平台使用
  2. 部署环境_Hyperledger Fabric Composer环境部署(一)
  3. 牛人学习h264运动估计的方法
  4. linux /etc/security/limits.conf的相关说明
  5. wamp环境单独安装(windows下apache2.4、mysql5.5、php5.5的版本)
  6. 24小时动手学prezi入门到精通+破解(全能“破解”软件)
  7. 移动通讯技术--3G
  8. 当我们在聊「开源大数据调度系统Taier」的数据开发功能时,到底在讨论什么?
  9. vue开发web端实现列表左右联动效果
  10. 环保设备物联网远程监控维护解决方案
  11. pycharm怎么快速注释-块注释
  12. windpy 连接数据库_python wind数据库
  13. Excel之利用Excel的排序功能可以让表格整体按照某一列降序排列而排列(一)
  14. 从前端角度浅谈如何做好网站的SEO优化
  15. glove 词向量词嵌入文件下载
  16. 安卓开发 输入单词表,点击读出单词 TextToSpeech
  17. “云管边端”协同的边缘计算安全防护解决方案
  18. 警惕IE7新漏洞导致的木马病毒暴增
  19. ACM竞赛穷举之古堡算式
  20. openwrt 格式化_一步一步教你制作openwrt卡系统

热门文章

  1. 《互联网运营智慧》终于上市销售了
  2. legend3---laravel验证码使用
  3. 【翻译】QEMU内部机制:顶层概览
  4. May 18:PHP 用到的学习工具
  5. SpringMVC:学习笔记(4)——处理模型数据
  6. C#枚举类型和结构体
  7. CodeForces 671C - Ultimate Weirdness of an Array
  8. 06python 之基本数据类型
  9. SQL Server 2005 Service Broker 初探
  10. 设置tomcat使用指定的jdk版本