android-studio - Android OnTouchEvent()什么时候该 return super.onTouchEvent(event)?
PHP中文网
PHP中文网 2017-04-17 17:47:16
0
2
519

自定义View在构造器初始化时设置了一个OnClickListener的监听器,但是如果在OnTouchEvent() 中返回true就没有办法回调onClick()?


// 一个简单的自定义View,让View跟随手指滑动,同时点击时弹出Toast
public class DragView2 extends View implements View.OnClickListener {
    private static final String TAG = "DragView";

    private float mLastX;
    private float mLastY;

    public DragView2(Context context) {
        this(context, null);
    }

    public DragView2(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DragView2(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setBackgroundColor(getResources().getColor(R.color.colorPrimary));
        Log.d(TAG, "DragView2: ");
        setOnClickListener(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int offsetX = (int) (event.getX() - mLastX);
        int offsetY = (int) (event.getY() - mLastY);
        switch (event.getAction()) {

            case MotionEvent.ACTION_MOVE:
                //  使View本身开始移动
                offsetLeftAndRight(offsetX);
                offsetTopAndBottom(offsetY);
                break;
            case MotionEvent.ACTION_UP:
                mLastX = event.getX();
                mLastY = event.getY();
                break;
        }
        // return true 无法触发点击事件;return false时无法发生滑动 ; 
        // return super.onTouchEvent(event);才能触发这两个事件
        // 为什么?
        return super.onTouchEvent(event);
    }


    @Override
    public void onClick(View v) {
        Log.d(TAG, "onClick: ");
        Toast.makeText(getContext(), "onClick", Toast.LENGTH_SHORT).show();
    }
}

返回true 不是表示此触摸事件已被消化,为何只有 return super.onTouchEvent(event); ,才能同时保留滑动和点击事件?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(2)
黄舟

OnClickListener.onClick()是在原生的View.onTouchEvent()方法里面回调的, 你自己重写了这个方法, 而且不调用super.onTouchEvent(event)的话当然就不会回调onClick()方法了.

左手右手慢动作

onClick方法是在onTouchEvent方法裡呼叫的。你可能不理解重寫的意義,你不使用super呼叫父類別的onTouchEvent方法? onClick是不會被執行的。
還有,你可能也不理解事件分發機制,我不相信一個不理解事件分發的程式猿能夠自訂View。關於事件分發可以參考以下文章:http://m.blog.csdn.net/articl...

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!