view事件的处理机制

##以ImageView为例说明View的事件处理机制,ImageView中没有去重写dispatchTouchEvent(ev)

    view上的dispatchTouchEvent(ev)方法
    public boolean dispatchTouchEvent(MotionEvent event) {
	...
	//mOnTouchListener就是imageView调用setOnTouchListener传递进来的对象
	//onTouch返回值结果由自己重写onTouch决定的,如果返回值为true,那当前if条件满足,直接返回true,即dispatchTouchEvent返回true

	// dispatchTouchEvent返回true,当前view响应所有事件
	// 如果onTouch返回的false,顺序执行onTouchEvent(event),需要继续向下分发寻找目标view.
	if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == 
					ENABLED &&mOnTouchListener.onTouch(this, event)) {
		   return true;
	}
	return onTouchEvent(event);
    }

    public void setOnTouchListener(OnTouchListener l) {
        mOnTouchListener = l;
    }
	
    imageView.setOnTouchListener(new OnTouchListener() {
    	@Override
    	public boolean onTouch(View v, MotionEvent event) {
    		Log.i(tag, "ImageView onTouch event = "+event.getAction());
    		return true;
    	}
    });

	
    public boolean onTouchEvent(MotionEvent event) {
        ...
	//当前控件是否可以被点击,如果可以被点击进入if,返回true,即dispatchTouchEvent(ev)返回true,当前view响应所有事件
	//不可以被点击,不进入if,直接返回false,即dispatchTouchEvent(ev)返回false,当前view不响应所有事件
        if (((viewFlags & CLICKABLE) == CLICKABLE ||
                (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
			...
			//点击事件的调用方式,就是回调方法
	                performClick();
	               ...
            return true;
        }

        return false;
    }

    //imageView默认没有可点击的事件,但如果添加以下代码,就给其加上了点击事件
	
    //其实就是调用View中setOnClickListener方法
    public void setOnClickListener(OnClickListener l) {
		//加上可点击事件
        if (!isClickable()) {
            setClickable(true);
        }
        mOnClickListener = l;
    }


    imageView.setOnClickListener(new OnClickListener() {
    	@Override
    	public void onClick(View v) {
		//在之前的OnTouchListener中的onTouch方法内部返回false,打印两次
    	}
    });

    public boolean performClick() {
        ....
        if (mOnClickListener != null) {
            ...
	    //回调onclick方法
            mOnClickListener.onClick(this);
           ...
        }
        ...
    }

    ///上述是源码中的方法,dispatchTouchEvent作用是将touch事件向下传递直到遇到被触发的目标view,
    如果返回true,表示当前view就是目标view,事件停止向下分发。
    否则返回false,表示当前view不是目标view,需要继续向下分发寻找目标view.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值