[Android] 判斷觸摸事件是否在View內(nèi)

在應用中有時需要判斷觸摸事件的位置是否在某個 View 內(nèi),可以按照如下方法判斷:

1. 獲取 View 的坐標

Android 中使用矩形表示一個 View 的坐標,獲取 View 在屏幕中的位置并將其轉(zhuǎn)換成矩形坐標:

/**
 * 計算指定的 View 在屏幕中的坐標。
 */
public static RectF calcViewScreenLocation(View view) {
    int[] location = new int[2];
    // 獲取控件在屏幕中的位置,返回的數(shù)組分別為控件左頂點的 x、y 的值
    view.getLocationOnScreen(location); 
    return new RectF(location[0], location[1], location[0] + view.getWidth(),
            location[1] + view.getHeight());
}

2. 獲取觸摸事件相對于屏幕的位置:

// MotionEvent event;
// event.getX(); 獲取相對于控件自身左上角的 x 坐標值
// event.getY(); 獲取相對于控件自身左上角的 y 坐標值
float x = event.getRawX(); // 獲取相對于屏幕左上角的 x 坐標值
float y = event.getRawY(); // 獲取相對于屏幕左上角的 y 坐標值

3. 使用 Rect.contains(float, float) 判斷觸摸事件是否在 View 內(nèi):

// View view;
RectF rect = calcViewScreenLocation(view);
boolean isInViewRect = rect.contains(x, y);

擴展

1. 在 Activity 的 onCreate() 方法中由于控件尚未繪制完成,獲取不到控件的高度、位置,可以在 Activity 的 onWindowFocusChanged() 方法中獲?。?/strong>

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        RectF rect = calcViewScreenLocation(viewMotion); // 獲取控件的坐標
    }
}

2. 可以使用 RectF.contains(RectF)、RectF.contains(float, float, float, float) 判斷一個矩形是否包含在另一個矩形中:

// RectF source;
// RectF target;
// 判斷 target 矩形是否包含在 source 矩形中
boolean isTargetInSource = source.contains(target);
boolean isTargetInSource = source.contains(target.left, target.top,
        target.right, target.bottom);

源碼:

GitHub: MotionDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,327評論 0 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,021評論 25 709
  • 一、Android開發(fā)初體驗 二、Android與MVC設計模式模型對象存儲著應用的數(shù)據(jù)和業(yè)務邏輯。模型類通常用來...
    為夢想戰(zhàn)斗閱讀 1,067評論 0 3
  • 躺在異鄉(xiāng)的床上,夢里全是故鄉(xiāng) 那個小城,那個小鎮(zhèn),那個小村落…… 有你,有你們, 有他(她),有她(他)們…… 唯...
    素衣浪子閱讀 300評論 0 0
  • 喜歡萌萌噠的摳腳怪蜀黍,愛吃蘸辣椒水的甜甜圈,窩就是偽裝小清新的重口味妹紙,這才是完整的我
    sheiny閱讀 367評論 0 1

友情鏈接更多精彩內(nèi)容