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