2011-09-02 89 views
3

我有一个自定义视图,我希望为其处理触摸事件。特别是,在视图上拖动手指应该使其内容滚动。要做到这一点,我已经实现了以下onTouchListener:Android停止发送onTouch事件

private OnTouchListener graphOnTouchListener = new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     System.out.println("onTouch called"); 
     System.out.println("view width: " + v.getWidth()); 
     System.out.println("view height: " + v.getHeight()); 
     System.out.println("view: " + v); 

     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       // First finger down 
       System.out.println("ACTION_DOWN x: " + event.getX() + ", y: " + event.getY()); 
       startTouch(event.getX()); 
       break; 
      case MotionEvent.ACTION_UP: 
       // Last finger to be removed 
       System.out.println("ACTION_UP x: " + event.getX() + ", y: " + event.getY()); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       // A finger moves 
       System.out.println("ACTION_MOVE x: " + event.getX() + ", y: " + event.getY()); 
       moveTouch(event.getX()); 
       break; 
      default: 
       break; 
     } 

     // The event has been handled, so return true 
     return true; 
    } 
}; 

可正常工作,除非用户或移动他们的手指上下,而在视图。此时,触发事件停止发送(如LogCat中缺少输出所证明的)。但是,使用adb shell getevent仍然会显示通过触摸移动生成的事件。

任何人都可以建议我怎么能纠正这个?

按照要求,布局XML的样子:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#ffffff"> 
    <FrameLayout android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     <ScrollView android:layout_width="fill_parent" 
      android:layout_height="fill_parent" android:padding="10dip"> 
      <LinearLayout android:layout_width="fill_parent" 
       android:layout_height="fill_parent" android:orientation="vertical"> 
       <com.graphlib.ShaderAreaGraphView 
        android:layout_width="fill_parent" android:layout_height="200dip" 
        android:id="@+id/activity_power_realtime" android:background="#000000" /> 
       <LinearLayout android:layout_width="fill_parent" android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:gravity="center"> 
        <Button android:text="&lt;&lt;" android:id="@+id/goBackwardsButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
        <Button android:text="Zoom out" android:id="@+id/zoomOutButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
        <Button android:text="Zoom in" android:id="@+id/zoomInButton" android:layout_width="wrap_content" android:layout_height="wrap_content" ></Button> 
        <Button android:text="&gt;&gt;" android:id="@+id/goForwardsButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
       </LinearLayout> 
      </LinearLayout> 
     </ScrollView> 
    </FrameLayout> 
</LinearLayout> 
+0

请向我们展示布局xml。 –

+0

如果我理解正确,action_up是他们删除他们的手指?你想在这之后想要“休息”吗?以确保在移除手指后action_move不会被解雇? – yep

+0

是的,可能吧,但我对此没有太多兴趣。无论如何,我会编辑代码以阻止分心。 –

回答

2

事实证明,问题是视图包含在ScrollView中。删除ScrollView可以修复问题。

+0

正确,我的自定义视图位于垂直滚动视图中,onTouch事件在自定义视图中水平工作,但在垂直移动手指时停止。 – Lumis

3

你需要写在每种情况下break语句。否则每个案件都被执行。

 case MotionEvent.ACTION_DOWN: 
      // First finger down 
      System.out.println("ACTION_DOWN x: " + event.getX() + ", y: " + event.getY()); 
      startTouch(event.getX()); 
      break; 
     case MotionEvent.ACTION_UP: 
      // Last finger to be removed 
      System.out.println("ACTION_UP x: " + event.getX() + ", y: " + event.getY()); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      // A finger moves 
      System.out.println("ACTION_MOVE x: " + event.getX() + ", y: " + event.getY()); 
      moveTouch(event.getX()); 
      break; 

,或者你可以放进如果...否则,如果条件

+0

这没有任何效果,但我仍然编辑了原始代码。 –

+0

你面临的问题我测试你的听众它完美的工作给我的坐标向下,移动,并加快时间 – Pratik

+0

左右拖动一下,然后向上移动。在左右移动后不会创建事件(至少不会在Nexus One或模拟器上进行测试)。 –

0

在交换机的底部,尝试添加

default: 
    break; 

可能不是固定的,但它是很好的做法有这个。

+0

不幸的是,这并没有解决任何问题。我已经用你的建议更新了代码。 –

1

解决此问题的简单方法是创建对滚动视图的引用,例如myScrollView =(ScrollView)findViewById(R.id.myScrollView)。然后在onTouchEvent,ACTION_DOWN状态下:

myScrollView.requestDisallowInterceptTouchEvent(true);

而在ACTION_UP

myScrollView.requestDisallowInterceptTouchEvent(假);