在Android父级和子级自定义视图上触摸事件处理

时间:2012-09-12 05:05:15

标签: android touch swipe custom-view gesturedetector

今天我在android自定义视图上遇到了触摸事件处理的问题。在这种情况下,我创建了父视图调用weekview和chiled调用weekdayview.i想要实现触摸事件,如singleTap,LongPress仅在子视图中,当我滑动时父母或孩子我想滚动父视图。当我在两个视图中实现触摸事件时它不起作用。

enter image description here

任何人都可以帮助我。这对我很有帮助。 谢谢

2 个答案:

答案 0 :(得分:2)

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
    }


}

这是peso-code(不是真正的android java)向您展示使用GestureDetector的概念,您可以在父视图中处理子视图中的所有事件。当我在我的Android手机上测试时,ChildView中的onTouchEvent无法很好地识别ACTION_UP,所以即使你刷你的子视图,有时也不会使用fling(这取决于ACTION_UP)。

因此,如果您想在Child View上编写更准确的滑动,请更好地编写您的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
     }


}

答案 1 :(得分:0)

设置滑动速度(以检测用户的滑动意图)并覆盖子视图中的onTouchEvent()。 在这里,调用super.onTouchEvent()并返回,调用父视图。处理父视图中的事件。