自定义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);
,才能同时保留滑动和点击事件?
OnClickListener.onClick()
是在原生的
View.onTouchEvent()
方法里面回调的, 你自己重写了这个方法, 而且不调用
super.onTouchEvent(event)
的话当然就不会回调
onClick()
方法了.
onClick方法是在onTouchEvent方法里调用的。你可能不理解重写的意义,你不使用super调用父类的onTouchEvent方法?onClick是不会得到执行的。
还有,你可能也不理解事件分发机制,我不相信一个不理解事件分发的程序猿能够自定义View。关于事件分发可以参考以下文章:http://m.blog.csdn.net/articl…