2012-08-13 30 views
1

我对Android编程非常陌生,并试图通过嵌套视图了解触摸事件。首先,这里是我的应用程序的描述:使用多个视图/布局处理Android中的触摸事件

我有一个相对的布局,我已经通过GUI编辑器添加了。一切都是默认的。我还创建了一个名为ClipGrid的类,它扩展了ScrollView。嵌套在那里,我做了一个Horizo​​ntalScrollView。在里面,我做了一个TableLayout,它是行。这些行包含按钮。

最终结果是一个按钮的网格。它一次显示4x4,但可以滚动任一方向显示其他按钮。我从它的主要活动中调用它到这样的屏幕: ClipGrid clip_grid = new ClipGrid(this); setContentView(clip_grid);

我这样做只是为了测试目的,我想我将不得不稍后改变它,当我想添加其他视图到我的relativelayout。但我认为这可能会影响触摸事件。

最后,我想要检测网格何时移动,并在用户提起手指时将新近可见的4x4网格按钮捕捉到我的布局边缘。我只是不知道如何去实现这一点,任何帮助将不胜感激。谢谢。

回答

3

触摸事件的处理方式是一种层叠效应,从顶视图开始,到下层嵌套视图。基本上,Android会将事件传递给每个视图,直到返回true

你可以实现的onTouchEvent事件View的一般方法是:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    boolean actionHandled = false; 
    final int action = event.getAction(); 

    switch(action & MotionEventCompat.ACTION_MASK) { 
    case MotionEvent.ACTION_DOWN: 
     // user first touches view with pointer 
     break; 
    case MotionEvent.ACTION_MOVE: 
     // user is still touching view and moving pointer around 
     break; 
    case MotionEvent.ACTION_UP: 
     // user lifts pointer 
     break; 
    } 

    // if the action was not handled by this touch, send it to other views 
    if (!actionHandled) 
    actionHandled |= super.onTouch(v, MotionEvent.event); 

    return actionHandled; 
} 
+0

感谢回答。所以说,我想我的表格布局来处理触摸事件。由于它嵌套在水平滚动视图和滚动视图中,是否从这些父视图返回false(并且表格布局为true),还是不实现该事件?作为一个方面说明,是否有更好的方法来实现我想要做的事情? – ultra 2012-08-13 13:44:40

+0

如果视图不处理触摸事件,则不要实现它。他们默认返回false。从听起来像,你可能想看看'ViewPager'。除此之外,您可能需要检测ScrollView中的滑动事件。它给出并且知道它的孩子的维度。如果它控制了运动而不是孩子,它也会更好。通过'ScrollViews',你还可以使用'onInterceptTouchEvent()',它基本上从顶视图中窃取触摸事件来处理它,然后将事件给予子项。 – DeeV 2012-08-13 13:54:42

+0

谢谢,这让我走向正确的方向,现在我有它的工作。事实证明,我必须从scrollview或其嵌套的水平滚动视图实现onTouchListener,否则它只会检测一个方向的滚动。同样,从这些返回true将实际上停止滚动表格布局。 – ultra 2012-08-13 23:29:01