日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2025/6/17 Android 37 豆豆

文章目錄

        • 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 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。