[英]How can I use OnClickListener in parent View and onTouchEvent in Child View?
我有一个自定义布局与标准setOnClickListener()调用。
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// some click related code
}
});
在此布局中,应该是一个应该水平拖动的视图。
我写了一些代码,它或多或少地做了我想要它做的事情:
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean result = true;
final int action = event.getAction();
final float x = event.getRawX();
final float y = event.getRawY();
switch (action) {
case MotionEvent.ACTION_DOWN: {
mInitialTouchX = x;
mInitialTouchY = y;
mStartX = getX();
mStartY = getY();
break;
}
case MotionEvent.ACTION_MOVE: {
Logger.d("MOVE");
if (direction == -1) {
}
final float dx = x - mInitialTouchX;
final float dy = y - mInitialTouchY;
mPosX = mStartX + dx;
mPosY = mStartY + dy;
if (Math.abs(dx) > SWYPE_MIN_TRAVEL) {
if (Math.abs(mPosX) < maximumSwypeDistance) {
setTranslationX(mPosX);
}
}
break;
}
case MotionEvent.ACTION_UP:
Logger.d("UP");
case MotionEvent.ACTION_CANCEL:
Logger.d("CANCEL");
case MotionEvent.ACTION_POINTER_UP:
Logger.d("POINTER_UP");
final float dx = x - mInitialTouchX;
if (Math.abs(dx) < SWYPE_MIN_TRAVEL) {
Logger.d("click");
result = false;
}
break;
}
return result;
}
问题是:我怎么能同时拥有两者?
编辑:好吧,使用Gunnar Karlssons事件的答案,我可以改变代码,在ACTION_UP
事件中手动执行点击,如下所示:
((ViewGroup) this.getParent()).performClick();
我不禁自己,但我发现这有点不满意。 我有更优雅的解决方案吗?
简短的回答是肯定的,你可以实现这种行为。 答案很长,你需要确保两个视图都能按预期获得触摸事件。 根据您所需的确切布局和预期行为,您可以使用以下几种方法:
在父项中使用onInterceptTouchEvent()并使用GestureDetector和SimpleOnGestureListener检测单击。
GestureDetector.SimpleOnGestureListener simpleOnGestureListener = new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onSingleTapUp(MotionEvent e) { // some click related code return true; } }; GestureDetector gestureDetector = new GestureDetector(context, simpleOnGestureListener); @Override public boolean onInterceptTouchEvent(MotionEvent e){ gestureDetector.onTouchEvent(e); return false; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.