【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
文章目錄
- 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 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据挖掘】卷积神经网络 ( 池化 |
- 下一篇: 【数据挖掘】K-NN 分类 ( 简介 |