其他分享
首页 > 其他分享> > Android onTouchListener 稳定判断触摸点坐标是否落在指定view上

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。
在这里插入图片描述
在这里插入图片描述

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

标签:getTop,getLeft,onTouchListener,触摸,touView,tarView,Android,view
来源: https://blog.csdn.net/qq_42944793/article/details/115586003