今天我在 android 自定义视图上处理触摸事件时遇到了问题。在这种情况下,我创建了父视图调用 weekview 和 chiled 调用 weekdayview。我想在子视图中实现像 singleTap、LongPress 这样的触摸事件,并且当我在父视图或子视图上滑动时我想滚动父视图。当我在两个视图中实现触摸事件时它不起作用。
任何人都可以帮助我。这对我真的很有帮助。谢谢
今天我在 android 自定义视图上处理触摸事件时遇到了问题。在这种情况下,我创建了父视图调用 weekview 和 chiled 调用 weekdayview。我想在子视图中实现像 singleTap、LongPress 这样的触摸事件,并且当我在父视图或子视图上滑动时我想滚动父视图。当我在两个视图中实现触摸事件时它不起作用。
任何人都可以帮助我。这对我真的很有帮助。谢谢
class ChildView extends View {
public void setGestureDetector (GestureDetector g)
{
gesture = g;
}
@Override
public boolean onTouchEvent (....)
{
return gesture.onTouchEvent (....); // touch event will dispatch to gesture
}
}
class ParentView extends View implements GestureDetector.OnGestureListener {
gesture = new GestureDetector (this);
child = new ChildView (...);
child.setGestureDetector (gesture);
@Override
public boolean onTouchEvent (..)
{
// handle your parent touch event here
}
public boolean onDown (...)
{
return true;
}
public boolean fling (...)
{
// here to handle child view fling
}
}
这是比索代码(不是真正的 android java),向您展示使用 GestureDetector 的概念,您可以在父视图中处理来自子视图的所有事件。正如我在我的安卓手机上测试的那样,ChildView 中的 onTouchEvent 并不能很好地识别 ACTION_UP,所以即使你滑动你的 Child View,有时也无法正常工作(这取决于 ACTION_UP)。
所以如果你想在你的子视图上写更准确的滑动,最好写你的 owen Gesture Detect 类,在你的 ChildView 中,你可以这样做 -
float oldX;
float distanceX;
public boolean onTouchEvent (MotionEvent event...)
{
if (event.getAction == MotionEvent.ACTION_DOWN) {
// handle down
oldX = event.getX ();
}
if (event.getAction == MotionEvent.ACTION_MOVE {
// handle move
distanceX = event.getX() - oldX; // more accurate
gesture.onSwipe (distanceX); // your own gesture class
}
}
设置您的滑动速度(以检测用户的滑动意图)并覆盖子视图中的 onTouchEvent()。在这里,调用 super.onTouchEvent() 并返回,它调用你的父视图。处理父视图中的事件。