2010-12-03 8 views
1

私はカスタムAndroid UIを作成しました。このコントロールを処理するにはUIビューが必要です。キー押下確認とUIアクションのメンテナンスを行う方法は?

私のマウスボタンが(onDown /キーを押す)を押している間a)は、ビューは、例えば、(ことをやっておくべき:キーがダウンしている)

B)としてすぐに私は私のマウスキーを離すと、ビューには(たとえば、キーが上がっている)と表示されます。

サンプルフローは、ビューを押したときのようなものでなければなりません。

出力: (私はビュー上でマウスボタンを押してそれを保持)

キーは、キーはキーが押されてい

キーがあるダウン

ある

ダウンしています下へ

キーがダウン

キーは、キーがアップしているダウン

私は今、マウスボタンを放し

です。

さらに私の問題を説明します。私は私が私のマウスボタンを押すと、ロジックが

@Override 

public boolean onTouchEvent(MotionEvent event) { 
    Log.d(TAG, event.getAction()); 
} 

を行くべきコードスニペットを掲載しています、それは「私はそれを残す場合は、それがログに出力しながら、「0」、(意味マウスがダウンしている)印刷します1 "は、マウスがアップしていることを意味します。それは論理に役立つはずです。

ありがとうございます。


まあ、私はタッチがそれがvolatile boolean stop = falseフィールドを持っていると眠った後、すべてのループでこの値をチェックしていることが発生した場合たぶん、あなたがスレッドを作成して開始することができ

private static int checkValue = 0; 

@Override 

public boolean onTouchEvent(MotionEvent event) { 

    checkValue = event.getAction(); 

    while (checkValue == 0){ 

    Log.d(TAG, "Pressed"); 
    checkValue = checkMethod(event.getAction); 


} 

    private int checkMethod(int test){ 

    if (checkValue == 0){ 

     checkValue = 0; 
     } 

    else checkValue = 1; 
} 
+0

何を試しましたか?何がうまくいかない。また、あなたはアンドロイド上にマウスを持っていません。あなたがエミュレータについて話しているなら、それは触れている。 – Falmarri

+0

yah私はタッチについて話しています。 :) –

+0

私はどのように解決しようとしたのかを追加しましたが、私はそのバギーロジックを知っています。 –

答えて

1

を追加しました。

button.setOnTouchListener(onTouchListener); 

ユーザーがボタンに触れると、ACTION_DOWNイベントが発生します。ユーザーがボタンを離すと、ACTION_UPイベントが発生します。必要ならば、boolean変数に対してチェックできるスレッドでループを開始することができます。私はそれが正しいかどうかをチェックしませんでしたが、それは次のようになります。あなたは決して魔法の整数を使用する必要があります

private OnTouchListener onTouchListener = new OnTouchListener() { 

     private boolean flag = false; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (v.getId() == R.id.button) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        flag = true; 
        Thread thread = new Thread(new Runnable() { 

         @Override 
         public void run() { 
          while(flag) { 
           //do something 
          } 
         } 
        }); 
        thread.start(); 
       } else if (event.getAction() == MotionEvent.ACTION_UP) { 
        flag = false; 
       } 
      } 
      return true; 
     } 
    } 
+0

投稿したコードスニペットがうまくいきました:)しかし、私のボタン(Action_up)をリリースしても、数秒で停止することができます。コードはより速く反応するように改善することができましたか? :) btw助けてくれてありがとう... –

1

のようなものを試してみましたしばらく。タッチが終了すると、boolean変数をfalseに設定できます。

編集:だけOnTouchEventListener ...

private OnTouchListener onTouchListener = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (v.getId() == R.id.button) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       //start loop or background task 
      } else if (event.getAction() == MotionEvent.ACTION_UP) { 
       //do something different 
      } 
     } 
     return true; 
    } 
} 

を定義...そして、あなたのボタンに割り当てる例

private MyHandler h; 

public void handleDown() { 
    System.out.println("touch began"); 
    h = new MyHandler(); 
    h.start(); 
} 

public void handleUp() { 
    h.pleaseStop = true; 
    System.out.println("touch ended"); 
} 

class MyHandler extends Thread { 
    volatile boolean pleaseStop = false; 

    public void run() { 
    while (!pleaseStop) { 
     System.out.println("touch is active..."); 
     Thread.sleep(500); 
    } 
    } 
} 
+0

あなたは私に行くためにいくつかの大雑把なコードスニペットを投稿できますか?ありがとう...そしてはい、私はすぐにキーがリリースされると停止する必要があります。 –

+0

@Shahab:例を加えました – thejh

+0

ありがとうございました:) –

1
checkValue = event.getAction(); 
while (checkValue == 0){ 

。 APIで定義された定数を使用します。

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_DOWN

実際にあなたのコードでも移動イベントを占めていません。それはダウンイベントでなければそれはアップであると仮定しているようです...これは完全に間違っています。

あなたが期待する、と興味のある特定のアクションのために正しいことを行うことができますどの値アクション参照するにはドキュメントを見てみると、たとえばアップのために:。

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_UP

+0

いいアドバイスありがとう:D –

0

開始されたスレッドを作成します。それを生き続けるための真偽のフラグを持っています。タッチが解放されると、フラグがfalseに設定され、スレッドが結合されます(終了します)。

スレッドはメインロジックとは独立しているため、処理が高速です。

関連する問題