View與ViewGroup的位置參數(shù)、觸摸事件坐標(biāo)及手勢(shì)識(shí)別
View與ViewGroup
View和ViewGroup是Android中最基本的UI組件,在構(gòu)建Android應(yīng)用程序的用戶界面時(shí)起著核心作用。
- 「View」:
定義:View表示屏幕上的一個(gè)獨(dú)立的可見元素。是Android平臺(tái)中用戶界面體現(xiàn)的基礎(chǔ)單位,是一個(gè)可見的矩形區(qū)域,可以響應(yīng)用戶的交互事件。
示例:TextView、ImageView、Button等都是View的具體實(shí)例。這些元素各自提供了特定的UI功能和交互方式。
繼承關(guān)系:View繼承自android.view.View類。
用途:View是布局中的實(shí)際頁面元素,構(gòu)成了用戶界面的基礎(chǔ)內(nèi)容。
- 「ViewGroup」:
定義:ViewGroup表示屏幕上的一個(gè)容器,能夠包含其他View或ViewGroup。是一種特殊的View,用于組織和管理其子View的布局和層次結(jié)構(gòu)。
示例:LinearLayout、RelativeLayout、FrameLayout等都是ViewGroup的具體實(shí)例。這些容器各自提供了不同的布局方式和管理策略。
繼承關(guān)系:ViewGroup繼承自View類。ViewGroup本質(zhì)上也是一個(gè)View,但具有額外的功能來容納和管理其他View。
用途:ViewGroup用于控制其內(nèi)部View的視圖結(jié)構(gòu),如控制子View的排列方向、間隔大小等。在Android中,布局是由View和ViewGroup共同組成的。
View位置參數(shù)
View的位置參數(shù)主要決定了其在屏幕上的具體位置和大小。
圖片
- 「top」:表示View左上角的縱坐標(biāo)。相對(duì)于其父容器(ViewGroup)的頂部邊緣的距離。
- 「left」:表示View左上角的橫坐標(biāo)。相對(duì)于其父容器(ViewGroup)的左側(cè)邊緣的距離。
- 「right」:表示View右下角的橫坐標(biāo)。相對(duì)于其父容器(ViewGroup)的左側(cè)邊緣的距離。View的寬度(width)可以通過right - left計(jì)算得出。
- 「bottom」:表示View右下角的縱坐標(biāo)。相對(duì)于其父容器(ViewGroup)的頂部邊緣的距離。View的高度(height)可以通過bottom - top計(jì)算得出。
//View坐標(biāo)的四個(gè)參數(shù)的獲?。篻etLeft(),getTop(),getRight(),getBottom()
left = getLeft();
top = getTop();
right = getRight();
bottom = getBottom();
//View寬高的獲取
width = getWidth();
height = getHeight();
//坐標(biāo)和View寬高的關(guān)系
width = right-left;
height = bottom-top;
坐標(biāo)都是相對(duì)于其父容器的,也就是說,如果一個(gè)View被放置在一個(gè)具有不同位置的ViewGroup內(nèi)部,那么它的top、left、right和bottom值也會(huì)相應(yīng)地改變。
從Android 3.0開始,View還增加了以下幾個(gè)額外的參數(shù):
- 「x」:表示View左上角的橫坐標(biāo)(包括任何平移變換)。這個(gè)值是通過left + translationX計(jì)算得出的。
- 「y」:表示View左上角的縱坐標(biāo)(包括任何平移變換)。這個(gè)值是通過top + translationY計(jì)算得出的。
- 「translationX」:表示View在水平方向上相對(duì)于其原始位置的偏移量。
- 「translationY」:表示View在垂直方向上相對(duì)于其原始位置的偏移量。
這些額外的參數(shù)可以對(duì)View進(jìn)行更復(fù)雜的變換和動(dòng)畫效果,例如平移、旋轉(zhuǎn)等。
MotionEvent坐標(biāo)
MotionEvent的坐標(biāo)主要涉及到觸摸事件在屏幕上的具體位置,這些位置信息對(duì)于理解用戶的手勢(shì)和操作至關(guān)重要。
圖片
- 「相對(duì)坐標(biāo)與絕對(duì)坐標(biāo)」
「相對(duì)坐標(biāo)」:通過getX()和getY()方法獲取的坐標(biāo)是相對(duì)于當(dāng)前消費(fèi)這個(gè)事件的視圖(View)的左上點(diǎn)的坐標(biāo)。坐標(biāo)是相對(duì)于觸發(fā)事件的特定View的,而不是整個(gè)屏幕。
「絕對(duì)坐標(biāo)」:通過getRawX()和getRawY()方法獲取的坐標(biāo)是相對(duì)于整個(gè)屏幕的,即屏幕左上角為原點(diǎn)(0,0)的坐標(biāo)系統(tǒng)。
- 「坐標(biāo)值的解釋」
當(dāng)觸摸事件發(fā)生時(shí),使用getX()和getY()來獲取觸摸點(diǎn)相對(duì)于當(dāng)前View左上角的x和y坐標(biāo)。例如,如果觸摸點(diǎn)位于View的中心,并且View的大小為200x200像素,那么getX()和getY()可能會(huì)返回接近100的值(假設(shè)沒有滾動(dòng)或變換)。
getRawX()和getRawY()將返回觸摸點(diǎn)相對(duì)于屏幕左上角的坐標(biāo)。無論觸摸點(diǎn)在哪個(gè)View上,getRawX()和getRawY()都將返回相同的值(只要觸摸點(diǎn)的屏幕位置沒有改變)。
- 「示例代碼」
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX(); // 獲取相對(duì)坐標(biāo)的x值
float y = event.getY(); // 獲取相對(duì)坐標(biāo)的y值
float rawX = event.getRawX(); // 獲取絕對(duì)坐標(biāo)的x值
float rawY = event.getRawY(); // 獲取絕對(duì)坐標(biāo)的y值
return true;
}
- 「坐標(biāo)與手勢(shì)識(shí)別」了解MotionEvent中的坐標(biāo)對(duì)于識(shí)別和理解用戶的手勢(shì)(如滑動(dòng)、點(diǎn)擊、縮放等)至關(guān)重要。例如,通過比較連續(xù)觸摸事件的坐標(biāo)變化,可以識(shí)別出用戶是否在進(jìn)行滑動(dòng)操作,以及滑動(dòng)的方向和距離。