Android 触摸事件系列二:onClick事件是如何触发的

Onclick 事件的触发条件

先来废话一下。

  • setOnClickListener
  • View 没有重写 OnTouchEvent ( 默认情况下 所有触摸事件返回都是clickable,也就是如果View 是可点击的,那么它会消耗一切事件)
  • 手指没有移动出View的范围。
  • 有抬起动作

为什么手指移出 View 的范围,不会触发OnClick?

onTouchEvent Move 动作处理:

                case MotionEvent.ACTION_MOVE:
                   // Be lenient about moving outside of buttons
                    if (!pointInView(x, y, mTouchSlop)) {
                        // Outside button
                        // Remove any future long press/tap checks
                        removeTapCallback();
                        removeLongPressCallback();
                        if ((mPrivateFlags & PFLAG_PRESSED) != 0) {
                            setPressed(false);
                        }
                        mPrivateFlags3 &= ~PFLAG3_FINGER_DOWN;
                    }
                    break;

上面的代码,当pointInView(x, y, mTouchSlop)为false 的时候 ,也就是手指移出View范围,setPressed(false),也就是设置取消了Pressed状态。

而Onclick 事件是在Up 事件中触发的。

                case MotionEvent.ACTION_UP:
                    boolean prepressed = (mPrivateFlags & PFLAG_PREPRESSED) != 0;
                    if ((mPrivateFlags & PFLAG_PRESSED) != 0 || prepressed) {
                        if (!mHasPerformedLongPress && !mIgnoreNextUpEvent) {
                            if (!focusTaken) {
                                // Use a Runnable and post this rather than calling
                                // performClick directly. This lets other visual state
                                // of the view update before click actions start.
                                if (mPerformClick == null) {
                                    mPerformClick = new PerformClick();
                                }
                                if (!post(mPerformClick)) {
                                    performClick();
                                }
                            }
                        }

代码逻辑也很简单:手机抬起时,只要是处于Pressed 状态,就会触发performClick() ,也就是回调 onClick 。

如何实现 手指移出View后,仍然触发点击事件。

可以重写onTouchEvent 方法, 手动设置 View 的Press 状态。

public class TouchView extends TextView {
    public TouchView(Context context) {
        super(context);
    }

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

    public TouchView(Context context,  AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public TouchView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }
        @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        boolean result = super.dispatchTouchEvent(event);
        Log.e("touch_tag"," TouchView dispatchTouchEvent   " + MotionEvent.actionToString(event.getAction()) + " result = "+ result);
        return result;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean result = super.onTouchEvent(event);
        Log.e("touch_tag"," TouchView onTouchEvent   " + MotionEvent.actionToString(event.getAction()) + " result = "+ result);
        Log.e("touch_tag"," MainActivity  isPressed" + isPressed());
        //手动设置 pressed ,手指移出View 后,仍可以接收到 onClick 事件
        setPressed(true);
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值