2017-04-19 10 views
1

ビューの動きの方向(上、右、下、左)を変更する4つのボタンがあります。 動きは、このように呼ばれている:前に別のボタンをクリックしたときにonClickを防ぐ方法

handler.postDelayed(new Runnable() { 
    @Override 
     public void run() { 
      move(); 
      handler.postDelayed(this, delay); 
     } 
    }, delay); 

私は、以前の方向が反対した場合の方向を変更するには、ユーザーを防ぎたいです。しかし、私のアプリでは、あなたが押し上げるために右に移動し、次に非常に速く左に移動するビューにつながる可能性があります。望ましい動作は、ビューがこの場合には上に移動し、左には移動しないことです。

これはmove()がどのように見えるかです:

public void move() { 
    switch(direction) { 
     case 'N': moveUp(); 
      break; 
     case 'E': moveRight(); 
      break; 
     case 'S': moveDown(); 
      break; 
     case 'W': moveLeft(); 
      break; 
    } 
} 

これはonClick()です:

@Override 
    public void onClick(View view) { 
     switch(view.getId()) { 
      case R.id.buttonUp: 
       if(direction == 'S') { 
        break; 
       } 
       direction = 'N'; 
       break; 
      case R.id.buttonRight: 
       if(direction == 'W') { 
        break; 
       } 
       direction = 'E'; 
       break; 
      case R.id.buttonDown: 
       if(direction == 'N') { 
        break; 
       } 
       direction = 'S'; 
       break; 
      case R.id.buttonLeft: 
       if(direction == 'E') { 
        break; 
       } 
       direction = 'W'; 
       break; 
     } 
    } 

どのように私は、ビューが実際に移動する方向を確認することができますか?以前の値を別の変数に保存することはできません。ボタンを押すだけで、変数の値が正しい値にならない場合があります。

すでにpostdelayed()のハンドラをonClick()に追加しようとしましたが、これも機能しませんでした。

答えて

4

トリックは、実際のmove()メソッドで以前の移動方向を保存することです。だからあなたのmove()方法は、次のようになります。

public void move() { 
    switch(direction) { 
     case 'N': if (lastDirection != 'S') moveUp(); 
      break; 
     ... 
    } 
    lastDirection = direction; 
} 

ああ、および方向のために列挙型を作成してください。 Charsよりも使用する方がはるかに優れていることがわかります。

+0

ありがとうございます!これは私のために働いた。それは 'if(lastDirection!= 'S')' – sininen

+0

でなければなりません。 – radoh

関連する問題