検索

ホームページ  >  に質問  >  本文

android-studio - Android OnTouchEvent()什么时候该 return super.onTouchEvent(event)?

自定义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中文网2773日前556

全員に返信(2)返信します

  • 黄舟

    黄舟2017-04-17 17:49:16

    OnClickListener.onClick() はネイティブの View.onTouchEvent() メソッドでコールバックされます。このメソッドを自分で書き換えた場合、および super.onTouchEvent(event) を呼び出さなければ、当然、onClick() メソッドはコールバックされません。 >

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 17:49:16

    onClick メソッドは onTouchEvent メソッド内で呼び出されます。オーバーライドの意味がわかっていないのかもしれませんが、親クラスのonTouchEventメソッドを呼び出すのにsuperを使っていませんか? onClick は実行されません。
    また、イベント配布の仕組みを理解していないプログラマーが View をカスタマイズできるとは思えません。イベント配信については以下の記事を参照してください: http://m.blog.csdn.net/articl...

    返事
    0
  • キャンセル返事