Android onTouchListener 稳定判断触摸点坐标是否落在指定view上

onTouch事件中判断触摸点坐标是否落在指定view上

判断触摸点是否准确落在指定view的范围内,以确定那个view是否能够响应触摸时的某些事件。

一、event.getX()与getY()

例如我对一个touView设置setOnTouchListener

touView.setOnTouchListener((v, event) -> {
	switch (event.getAction()) {
    	case MotionEvent.ACTION_DOWN:
	    	break;
        case MotionEvent.ACTION_MOVE:
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            break;
	}
    return false;
});

even.getX()以及getY()获取到的坐标将是以touView左上角为原点建立的坐标系下的坐标。在这里插入图片描述

二、view.getTop()与getLeft()、getRight()、getBottom()

而当我们touView.getTop()以及getLeft(),getRight(),getBottom()获取到的坐标将是以touView的viewGroup左上角为原点建立的坐标系下的坐标。在这里插入图片描述

三、代码实现

知道这些基础知识就好办了,判断触摸点是不是在指定view内就判断x与y方向是否都满足在范围内即可。

/**
     * 判断触摸点是否在目标view上
     * 前提是touchView与tarView在同一viewGroup中
     *
     * @param touView 响应触摸事件的view
     * @param tarView 触摸点需要落在的目标view
     * @param x       event.getX()
     * @param y       event.getY()
     * @return 是否落在tarView上
     */
    private boolean pointInView(View touView, View tarView, float x, float y) {
        boolean xDir, yDir;
        //x方向
        if (tarView.getLeft() >= touView.getRight())//tarView在右边
            xDir = (x >= tarView.getLeft() - touView.getLeft() && x <= tarView.getRight() - touView.getLeft());
        else if (tarView.getRight() <= touView.getLeft()) //tarView在左边
            xDir = (x <= tarView.getRight() - touView.getLeft() && x >= tarView.getLeft() - touView.getLeft());
        else //tarView在重叠范围
            xDir = x >= tarView.getLeft() - touView.getLeft() && x <= tarView.getRight() - touView.getLeft();
        //y方向
        if (tarView.getTop() >= touView.getBottom())//tarView在下边
            yDir = (y >= tarView.getTop() - touView.getTop() && y <= tarView.getBottom() - touView.getTop());
        else if (tarView.getBottom() <= touView.getTop()) //tarView在上边
            yDir = (y <= tarView.getBottom() - touView.getTop() && y >= tarView.getTop() - touView.getTop());
        else //tarView在重叠范围
            yDir = y >= tarView.getTop() - touView.getTop() && y <= tarView.getBottom() - touView.getTop();
        return xDir && yDir;
    }

注意一定得判断x方向的左右边界和y方向的上下边界。

四、QQ聊天取消发送语音的bug

当我们长按输入语音时,我们的手指移动到垃圾桶图标上就应该显示取消该次语音的发送。可是我发现,这个取消发送的判定点居然在上方聊天内容显示区域也可以被判定到。你可以自己试一试,截止我发文时间,这个bug依然存在,我已经反馈了。这个估计就是在ACTION_MOVE事件下对判定条件边界考虑补充分产生的bug。
在这里插入图片描述在这里插入图片描述

看明白了吗,欢迎下方纠错。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值