美文网首页程序员
ImageView 点击事件区域限制

ImageView 点击事件区域限制

作者: lipyhui | 来源:发表于2019-06-28 19:22 被阅读0次

一、说明

  笔记主要是记录一些本人在开发当中的学习和使用笔记。笔记内容包含一些本人觉得重要的知识点、本人易犯的错误等。
  由于本人水平有限,其中出现的错误或者不合理的地方望各位读者多多包含,并指出其中不合理和错误的地方,以便我来修改正。谢谢!

二、笔记时间

  2019年06月28日

三、简述

  本文主要记录如何在 ImageView 限制某个区域响应点击事件。

四、详情

  在我们的开发当中,往往出现 ImageView 区域较大,但是点击事件却要比 ImageView 区域小。这种情况就需要我们自定义点击事件的触发区域了。
  在实际开发当中,我们项目有一个类似需求,就是点击 ImageView 图片资源响应点击事件,点击 ImageView 的其它地方不响应点击事件。我对点击事件进行了分发管理,下面是我的代码:

public class ClickImageView extends AppCompatImageView {

    public ClickImageView(Context context) {
        super(context);
    }

    public ClickImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                return isClick(event);

            case MotionEvent.ACTION_UP:
                if (isClick(event)) {
                    performClick();
                }
                break;

            default:
                break;
        }

        return super.dispatchTouchEvent(event);
    }

    /**
     * 触摸位置是否允许响应点击事件
     *
     * @param event
     * @return
     */
    private boolean isClick(MotionEvent event) {
        if (event.getPointerCount() != 1) {
            return false;
        }

        float[] values = new float[9];
        getMatrix().getValues(values);

        if (event.getX() < values[2] || event.getX() > (values[2] + getDrawable().getIntrinsicWidth())) {
            return false;
        }

        if (event.getY() < values[5] || event.getY() > (values[5] + getDrawable().getIntrinsicHeight())) {
            return false;
        }

        return true;
    }
}

  代码中有个需要注意的地方,就是我们用到了 Matrix,这个 Matrix 保存了 View 的一些坐标信息,其中 values[2] 就是 X 坐标,values[5] 就是 Y 坐标。

相关文章

网友评论

    本文标题:ImageView 点击事件区域限制

    本文链接:https://www.haomeiwen.com/subject/fosecctx.html