Android如何獲取子View的位置及坐標(biāo)詳解
一、View
1.1、View 概述
視圖 (View) 是一個(gè)容器,專(zhuān)門(mén)負(fù)責(zé)布局。表現(xiàn)為顯示在屏幕上的各種視圖,如 TextView、LinearLayout 等。
1.2、View 分類(lèi)
View 主要分為兩類(lèi),具體如下表格所示:
類(lèi)別 | 示例 | 特點(diǎn) |
---|---|---|
單一視圖 | 即一個(gè) View,如 TextView、EditText | 不包含子View |
視圖組 | 即多個(gè) View 組成的 ViewGroup,如 RelativeLayout | 包含子View |
1.3、View 類(lèi)簡(jiǎn)介
View 類(lèi)是 Android 中各種組件的基類(lèi);
View 的構(gòu)造函數(shù)有四個(gè),具體如下所示:
public View(Context context) { } public View(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { }
源碼中 View 的構(gòu)造函數(shù)
通過(guò)源碼的注釋我們可以看出:
- 如果 View 是在 Java 代碼里面 new 的,則調(diào)用第一個(gè)構(gòu)造函數(shù)-->View(Context);
- 如果 View 是在 xml 里聲明的,則調(diào)用第二個(gè)構(gòu)造函數(shù)-->View(Context, AttributeSet)。
二、Android 坐標(biāo)系
Android 坐標(biāo)系和數(shù)學(xué)上的坐標(biāo)系是不一樣的,定義如下:
- 屏幕的左上角為坐標(biāo)原點(diǎn)。
- 向右為 x 軸增大方向。
- 向下為 y 軸增大方向。
具體如下圖所示:
三、View 的位置
View 的位置是相對(duì)于父控件而言的,由 4 個(gè)頂點(diǎn)確定,如下圖 A、B、C、D 所示:
確定 View 的位置有四個(gè)參數(shù),分別是 Top、Bottom、Left、Right:
- Top:子 View 左上角距父 View 頂部的距離。
- Left:子 View 左上角距父 View 左側(cè)的距離。
- Bottom:子 View 右下角距父 View 頂部的距離。
- Right:子 View 右下角距父 View 左側(cè)的距離
具體如下圖所示:
四、獲取 View 位置的方式
View 的位置是通過(guò) getTop()、getLeft()、getBottom()、getRight() 函數(shù)進(jìn)行獲取的。
這里我寫(xiě)了一個(gè)小例子來(lái)演示這四個(gè)方法,如下所示:(獲取內(nèi)部子 View 的位置)
因?yàn)槭菫榱搜菔?View 的位置,所有我這里用絕對(duì)布局,并且大小的單位都是用 px,具體布局如下所示:
<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <RelativeLayout android:id="@+id/rl_1" android:layout_width="600px" android:layout_height="600px" android:layout_x="200px" android:layout_y="200px" android:background="@color/colorPrimaryDark"> <View android:id="@+id/view" android:layout_width="300px" android:layout_height="300px" android:layout_centerInParent="true" android:background="@color/colorAccent" /> </RelativeLayout> </AbsoluteLayout>
我們現(xiàn)在用四個(gè)方法來(lái)獲取一下 View 的位置,具體代碼如下所示:
public class CoordinateActivity extends AppCompatActivity { private View mView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_coordinate); rl1 = findViewById(R.id.rl_1); mView = findViewById(R.id.view); } @Override protected void onResume() { super.onResume(); new Handler().postDelayed(new Runnable() { @Override public void run() { MyLogUtils.i(mView.getTop() + "--Top --mView"); MyLogUtils.i(mView.getBottom() + "--Bottom --mView"); MyLogUtils.i(mView.getLeft() + "--Left --mView"); MyLogUtils.i(mView.getRight() + "--Right --mView"); MyLogUtils.i(mView.getX() + "--X --mView"); MyLogUtils.i(mView.getY() + "--Y --mView"); } }, 200); } }
打印結(jié)果如下所示:
最外層紫色的 View 的坐標(biāo)是(200,200),大小是 600px,在它內(nèi)部,有一個(gè)大小為 300px 的子 View 位于其中心位置,所以上述打印結(jié)果是完全正確的。
注意:
- 我這里調(diào)用 getTop() 等方法是在 onResume() 里面,并且延時(shí)了 200ms,是因?yàn)槿绻谎舆t直接調(diào)用,會(huì)出現(xiàn) View 還沒(méi)有繪制完,所以獲取到的位置都是 0,所以就用最簡(jiǎn)單的延遲處理了一下(這里的處理方法有很多,比如 View.post() 等);
- getX() 和 getY() 的意思是獲取子 View 相對(duì)父容器的坐標(biāo),所以這里結(jié)果都是 150。
總結(jié)
到此這篇關(guān)于Android如何獲取子View的位置及坐標(biāo)的文章就介紹到這了,更多相關(guān)Android獲取子View位置及坐標(biāo)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Android模擬器上模擬GPS功能總是null的解決方法
在我們開(kāi)發(fā)時(shí)需要在模擬器上模擬GPS,可在Location的時(shí)候總是null,下面與大家分享下具體的解決方法,感興趣的朋友可以參考下哈2013-06-06Android Studio實(shí)現(xiàn)登錄功能案例講解
這篇文章主要介紹了Android Studio實(shí)現(xiàn)登錄功能案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08自定義RadioButton和ViewPager實(shí)現(xiàn)TabHost帶滑動(dòng)的頁(yè)卡效果
在工作中又很多需求都不是android系統(tǒng)自帶的控件可以達(dá)到效果的所以這個(gè)時(shí)候就要自定義控件來(lái)達(dá)到效果:使用自定義RadioButton和ViewPager實(shí)現(xiàn)TabHost帶滑動(dòng)的頁(yè)卡效果2013-01-01Android Intent-Filter匹配規(guī)則解析
這篇文章主要介紹了Android Intent-Filter匹配規(guī)則的相關(guān)資料,幫助大家更好的進(jìn)行Android開(kāi)發(fā),感興趣的朋友可以了解下2020-12-12Android 后臺(tái)發(fā)送郵件示例 (收集應(yīng)用異常信息+Demo代碼)
今天介紹個(gè)更簡(jiǎn)單的方法,我們把異常信息收集后,通過(guò)后臺(tái)發(fā)送郵件方法,把相關(guān)異常信息發(fā)送到我們指定的郵箱里面2013-07-07Android應(yīng)用開(kāi)發(fā)中WebView的常用方法筆記整理
WebView即是在安卓本地應(yīng)用中打開(kāi)網(wǎng)頁(yè)視圖功能,其中對(duì)于JavaScript加載的各項(xiàng)操作是重點(diǎn)和難點(diǎn),本文就為大家送上Android應(yīng)用開(kāi)發(fā)中WebView的常用方法筆記整理2016-05-05Android自定義dialog簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了Android自定義dialog簡(jiǎn)單實(shí)現(xiàn)方法,實(shí)例分析了Android自定義對(duì)話框的相關(guān)設(shè)置技巧,代碼備有詳細(xì)的注釋便于理解,需要的朋友可以參考下2016-01-01Android編程實(shí)現(xiàn)抽屜效果的方法詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)抽屜效果的方法,結(jié)合具體實(shí)例形式分析了Android實(shí)現(xiàn)抽屜效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05Android Support Annotations資料整理
這篇文章主要介紹了Android Support Annotations資料整理的相關(guān)資料,需要的朋友可以參考下2017-05-05Android簡(jiǎn)單實(shí)現(xiàn)文件下載
這篇文章主要為大家詳細(xì)介紹了Android簡(jiǎn)單實(shí)現(xiàn)文件下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09