2011-01-25 9 views
2

、私はすべてが正常に動作します下のコードを実行すると、それはだ簡単なあなたの周りに移動することができます3個のボールを持つアプリ...onTouchevent()問題

public class dragndrop extends Activity { 
    /** Called when the activity is first created. */ 
     private ColorBall[] colorballs = new ColorBall[3]; // array that holds the balls 
     private static final String TAG="MyTAG"; 
     DrawView myView; 
     private int balID = 0; // variable to know what ball is being dragged 
     int X; 
     int Y; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Point point1 = new Point(); 
      point1.x = 50; 
      point1.y = 20; 
      Point point2 = new Point(); 
      point2.x = 100; 
      point2.y = 20; 
      Point point3 = new Point(); 
      point3.x = 150; 
      point3.y = 20; 


      // declare each ball with the ColorBall class 
      colorballs[0] = new ColorBall(this,R.drawable.bol_groen, point1); 
      colorballs[1] = new ColorBall(this,R.drawable.bol_rood, point2); 
      colorballs[2] = new ColorBall(this,R.drawable.bol_blauw, point3); 
      myView = new DrawView(this); 
     setContentView(myView); 
    } 


    public class DrawView extends View { 


     public DrawView(Context context) { 
      super(context); 
      setFocusable(true); //necessary for getting the touch events 

      // setting the start point for the balls 


     } 

     // the method that draws the balls 
     @Override protected void onDraw(Canvas canvas) { 

      //draw the balls on the canvas 
      for (ColorBall ball : colorballs) { 
       canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null); 
       } 

     } 



     // events when touching the screen 
     public boolean onTouchEvent(MotionEvent event) { 
      int eventaction = event.getAction(); 

      X = (int)event.getX(); 
      Y = (int)event.getY(); 

      switch (eventaction) { 

      case MotionEvent.ACTION_DOWN: // touch down so check if the finger is on a ball 
       balID = 0; 
       for (ColorBall ball : colorballs) { 
        Log.d(TAG,"inside action down inside for coords:"+X+" coords: "+Y); 
        Log.d(TAG,"ball coords:"+ball.getX()+" coords: "+ball.getY()); 

        int x =X; 
        int y =Y; 
        Log.d(TAG,"lalalalalala"+x+" coords: "+y); 



        if (x > ball.getX() && x < ball.getX()+50 && y > ball.getY() && y < ball.getY()+50){//if (X > ball.getX() && X < ball.getX()+50 && Y > ball.getY() && Y < ball.getY()+50){ 
         Log.d(TAG,"inside ball coords!!!!!!!!!!!!!!!!!!!!!!!!:"+ball.getX()+" coords: "+ball.getY()); 
         balID = ball.getID(); 


         break; 
        } 
        } 

       break; 


      case MotionEvent.ACTION_MOVE: // touch drag with the ball 
       // move the balls the same as the finger 
       if (balID > 0) { 
        colorballs[balID-1].setX(X-25); 
        colorballs[balID-1].setY(Y-25); 
       } 

       break; 

      case MotionEvent.ACTION_UP: 
       // touch drop - just do things here after dropping 

       break; 
      } 
      // redraw the canvas 
      myView.invalidate(); 
      return true; 

     } 


    } 


} 

しかし、私はからonToucheventを処理しようとすると、主な活動はうまくいかず、単純な変数(x、y)を読むことができないということが奇妙です! なぜこれが起こったのか分かりませんが、それがビューに入っている場合のみ、赤く表示されるようです。

public class dragndrop extends Activity { 
    /** Called when the activity is first created. */ 
     private ColorBall[] colorballs = new ColorBall[3]; // array that holds the balls 
     private static final String TAG="MyTAG"; 
     DrawView myView; 
     private int balID = 0; // variable to know what ball is being dragged 
     int X; 
     int Y; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Point point1 = new Point(); 
      point1.x = 50; 
      point1.y = 20; 
      Point point2 = new Point(); 
      point2.x = 100; 
      point2.y = 20; 
      Point point3 = new Point(); 
      point3.x = 150; 
      point3.y = 20; 


      // declare each ball with the ColorBall class 
      colorballs[0] = new ColorBall(this,R.drawable.bol_groen, point1); 
      colorballs[1] = new ColorBall(this,R.drawable.bol_rood, point2); 
      colorballs[2] = new ColorBall(this,R.drawable.bol_blauw, point3); 
      myView = new DrawView(this); 
     setContentView(myView); 
    } 


// events when touching the screen 
    public boolean onTouchEvent(MotionEvent event) { 
     int eventaction = event.getAction(); 

     X = (int)event.getX(); 
     Y = (int)event.getY(); 

     switch (eventaction) { 

     case MotionEvent.ACTION_DOWN: // touch down so check if the finger is on a ball 
      balID = 0; 
      for (ColorBall ball : colorballs) { 
       Log.d(TAG,"inside action down inside for coords:"+X+" coords: "+Y); 
       Log.d(TAG,"ball coords:"+ball.getX()+" coords: "+ball.getY()); 

       int x =X; 
       int y =Y; 
       Log.d(TAG,"lalalalalala"+x+" coords: "+y); 



       if (x > ball.getX() && x < ball.getX()+50 && y > ball.getY() && y < ball.getY()+50){//if (X > ball.getX() && X < ball.getX()+50 && Y > ball.getY() && Y < ball.getY()+50){ 
      Log.d(TAG,"inside ball coords!!:"+ball.getX()+" coords: "+ball.getY()); 
        balID = ball.getID(); 


        break; 
       } 
       } 

      break; 


     case MotionEvent.ACTION_MOVE: // touch drag with the ball 
      // move the balls the same as the finger 
      if (balID > 0) { 
       colorballs[balID-1].setX(X-25); 
       colorballs[balID-1].setY(Y-25); 
      } 

      break; 

     case MotionEvent.ACTION_UP: 
      // touch drop - just do things here after dropping 

      break; 
     } 
     // redraw the canvas 
     myView.invalidate(); 
     return true; 

    } 




    public class DrawView extends View { 


     public DrawView(Context context) { 
      super(context); 
      setFocusable(true); //necessary for getting the touch events 

      // setting the start point for the balls 


     } 

     // the method that draws the balls 
     @Override protected void onDraw(Canvas canvas) { 
      //canvas.drawColor(0xFFCCCCCC);  //if you want another background color  

      //draw the balls on the canvas 
      for (ColorBall ball : colorballs) { 
       canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null); 
       } 

     } 


    } 


} 

理由を知っている人は誰ですか?

はい@bigstones onToucheventは動作していますが、すべてのアクションをキャプチャしていますが、問題は、変数X、Yは、変数X、Yが値を持っていても印刷できないようですそれは私が言っていることはテストされている、私は試してみたし、if()文(getX、getY)からすべての値を整数に変更し、X、Y .....もう一度コードを確認してください!感謝! ありがとう!

+1

参照ごとに、Activity.onTouchEvent()は、いずれのビューもイベントを消費しない場合にのみ呼び出されます。たぶん、あなたの意見を注目に残すことで、すべてのイベントを「食べる」ことができますか? 'Activity.onTouchEvent()'は呼び出されますか? (あなたの答えに@bigstonesを追加して、通知を受けてください) – bigstones

+0

次回はあなたのコードを正しくフォーマットし、コード全体を投稿しないようにしてください。 – Falmarri

答えて

2

見つけました!私は、問題はそれが私はこれをしなかったのリスナーのいくつかの並べ替えを登録しなければならないレイアウトだったということであることがわかっ

私は私のメインCLASにこのコードを追加:

private OnClickListener previewListener = new OnClickListener() {  
    @Override 
    public void onClick(View v) { 
     System.err.println("I've been clicked"); 
    } 
}; 

そして、 onCreateメソッドへのこの行:

previewLayout.setOnClickListener(previewListener); 

それは働いた!

+0

クリックリスナーを追加することによる副作用があると思います。これは、これが 'setClickable(true)'を暗示しているということです。便利な機能を持たないリスナーを追加するのではなく、代わりに 'setClickable()'を呼び出してください。 –

0

DrawViewの外にonTouchを移動したようです。タッチイベントを処理しようとしているので、onTouchListenerを設定する必要がありますが、onClickListenerは設定しないでください。