2013-07-21 54 views
1

请看下面的代码。我只发布代码的重要部分。如何为整个屏幕设置OnTouchListener?

activity_game.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/fullView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".Game" > 

    <TextView 
     android:id="@+id/numberOfQuestionsLeft" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="20dp" 
     android:text="TextView" /> 
</RelativeLayout> 

Game.java

public class Game extends Activity { 



    private View fullView; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_game); 

     fullView = (View)findViewById(R.id.fullView); 
     fullView.setOnTouchListener(imageViewSwiped); 



    } 


OnTouchListener imageViewSwiped = new OnSwipeTouchListener() 
    { 
     public boolean onSwipeRight() 
     { 
      //code removed 
     } 

      public boolean onSwipeLeft() 
      { 
      //code removed 
       return true; 
      } 

      public boolean onSwipeBottom() 
      { 
       //code removed 
       return true; 
      } 


    }; 
} 

OnSwipTouchListener.java

注 - 我并不拥有这个类的代码。它由另一位SO成员撰写。

package game.Game; 
    import android.view.GestureDetector; 
    import android.view.GestureDetector.SimpleOnGestureListener; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.view.View.OnTouchListener; 

    public class OnSwipeTouchListener implements OnTouchListener { 

     private final GestureDetector gestureDetector = new GestureDetector(new GestureListener()); 

     public boolean onTouch(final View v, final MotionEvent event) { 
      return gestureDetector.onTouchEvent(event); 
     } 

     private final class GestureListener extends SimpleOnGestureListener { 

      private static final int SWIPE_THRESHOLD = 100; 
      private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

      @Override 
      public boolean onDown(MotionEvent e) { 
       return super.onDown(e); 
      } 

      @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
       boolean result = false; 
       try { 
        float diffY = e2.getY() - e1.getY(); 
        float diffX = e2.getX() - e1.getX(); 
        if (Math.abs(diffX) > Math.abs(diffY)) { 
         if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
          if (diffX > 0) { 
           result = onSwipeRight(); 
          } else { 
           result = onSwipeLeft(); 
          } 
         } 
        } else { 
         if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 
          if (diffY > 0) { 
           result = onSwipeBottom(); 
          } else { 
           result = onSwipeTop(); 
          } 
         } 
        } 
       } catch (Exception exception) { 
        exception.printStackTrace(); 
       } 
       return result; 
      } 
     } 

     public boolean onSwipeRight() { 
      return false; 
     } 

     public boolean onSwipeLeft() { 
      return false; 
     } 

     public boolean onSwipeTop() { 
      return false; 
     } 

     public boolean onSwipeBottom() { 
      return false; 
     } 
    } 

现在,我正在尝试使整个活动接触启用。请查看Game.java以查看我是如何做到的。但问题是,它不会对任何触摸事件做出反应!代码OnSwipTouchListener.java没有什么不对,因为我通过将侦听器设置为image view来使用了触摸事件。在尝试使整个活动触摸启用时必定存在问题。通过说“整个活动触摸启用”我的意思是,我需要滑过整个屏幕,而不是将听众添加到imageview

我在这里做了什么错?请帮忙!

+0

@Knight ..这些可能有助于.. [问题1](http://stackoverflow.com/questions/3641059/android-ontouchlistener-on-linearlayout) [问题2](HTTP:// stackoverflow.com/questions/5648985/ontouchlistener-for-entire-screen) [question 3](http://stackoverflow.com/questions/11180879/ontouchlistener-doesnt-work-with-relative-layout) – Dreamer

+0

@Dreamer :第三个环节就是答案。请提供它作为答案:) –

回答

0

将TouchListener添加到活动的最高级别布局。这将会发现任何在其他地方没有处理的情况。

+0

非常感谢答复。最高级别的布局是相对布局,我已经在代码 –

+0

@Knight中使用它,所以它的工作与否? – Dreamer

+0

@Dreamer:这部分已经在我的代码中。请看看'fullView'的id和变量。它引用了我发布的XML文件中的相对布局。它现在不工作 –

0

您的RelativeLayout是否可以对焦?

android:focusable="true" 

和/或

android:focusableInTouchMode="true" 
+0

现在设置。现在仍在工作:( –

2

这是我的例子:

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     super.onTouchEvent(event); 
     float x = event.getX(); 
     float y = event.getY(); 
     Toast.makeText(Example.this, "x=" + x + " y="+ y, 
       Toast.LENGTH_SHORT).show(); 
     return false; 
    } 

希望这对某人有帮助!欢呼!