찾다

 >  Q&A  >  본문

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일 전553

모든 응답(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
  • 취소회신하다