【问题标题】:OnTouchListener intercept when touch goes outside view当触摸超出视图时 OnTouchListener 拦截
【发布时间】:2014-08-22 12:16:48
【问题描述】:

我有一个代表按钮的 ImageView 和一个相对的 OnTouchListener 用于更改其中的图像(用于模拟按下它)并启动一个任务:

@Override
public boolean onTouch(View v, MotionEvent event) {
    ImageView button = (ImageView) v;

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN: {
        //change imageview image with pressed button
        return true;

    }
    case MotionEvent.ACTION_UP: {
            //change imageview image, and do a task
            return true;
    }

    }
    return false;
}

现在这两个事件对于我的范围来说是不够的。我希望,如果用户在 ImageView 上按住手指并在其外部滑动,则 ACTION_UP 内的任务将不会执行。 我该怎么做?

【问题讨论】:

  • 使用 event.getX() 和 event.getY() 来计算触摸区域。在onTouch()中根据区域处理事件

标签: android listener android-imageview ontouchlistener


【解决方案1】:

这是一个View.OnTouchListener,您可以使用它来查看在用户将手指放在视图之外时是否发送了MotionEvent.ACTION_UP

private OnTouchListener mOnTouchListener = new View.OnTouchListener() {

    private Rect rect;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v == null) return true;
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
            return true;
        case MotionEvent.ACTION_UP:
            if (rect != null
                    && !rect.contains(v.getLeft() + (int) event.getX(),
                        v.getTop() + (int) event.getY())) {
                // The motion event was outside of the view, handle this as a non-click event

                return true;
            }
            // The view was clicked.
            // TODO: do stuff
            return true;
        default:
            return true;
        }
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多