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

【字号: 日期:2022-11-24浏览:23作者:雯心

问题描述

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

// 一个简单的自定义View,让View跟随手指滑动,同时点击时弹出Toastpublic 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); ,才能同时保留滑动和点击事件?

问题解答

回答1:

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

回答2:

onClick方法是在onTouchEvent方法里调用的。你可能不理解重写的意义,你不使用super调用父类的onTouchEvent方法?onClick是不会得到执行的。还有,你可能也不理解事件分发机制,我不相信一个不理解事件分发的程序猿能够自定义View。关于事件分发可以参考以下文章:http://m.blog.csdn.net/articl...

相关文章: