[Android] 判断触摸事件是否在View内

在应用中有时需要判断触摸事件的位置是否在某个 View 内,可以按照如下方法判断:

1. 获取 View 的坐标

Android 中使用矩形表示一个 View 的坐标,获取 View 在屏幕中的位置并将其转换成矩形坐标:

/**
 * 计算指定的 View 在屏幕中的坐标。
 */
public static RectF calcViewScreenLocation(View view) {
    int[] location = new int[2];
    // 获取控件在屏幕中的位置,返回的数组分别为控件左顶点的 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 内:

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

扩展

1. 在 Activity 的 onCreate() 方法中由于控件尚未绘制完成,获取不到控件的高度、位置,可以在 Activity 的 onWindowFocusChanged() 方法中获取:

@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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,497评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,848评论 25 708
  • 一、Android开发初体验 二、Android与MVC设计模式模型对象存储着应用的数据和业务逻辑。模型类通常用来...
    为梦想战斗阅读 909评论 0 3
  • 躺在异乡的床上,梦里全是故乡 那个小城,那个小镇,那个小村落…… 有你,有你们, 有他(她),有她(他)们…… 唯...
    素衣浪子阅读 282评论 0 0
  • 喜欢萌萌哒的抠脚怪蜀黍,爱吃蘸辣椒水的甜甜圈,窝就是伪装小清新的重口味妹纸,这才是完整的我
    sheiny阅读 328评论 0 1