2

重複の可能性:
Android の onPress/onRelease

ユーザーがボタンを押したままにすると、ボタンの色が変わり、ユーザーがボタンを離すと、ボタンは通常の状態に戻ります。

これを捉えるイベントはありますか?

私はbutton.onStateChangedのようなものを検索しようとしましたが、運がありません..

編集: ユーザーが長くクリックすると、自動インクリメントを開始したい

// Auto increment for a long click
        increment.setOnLongClickListener(new View.OnLongClickListener() {
            public boolean onLongClick(View a) {
                autoIncrement = true;

                repeatUpdateHandler.removeCallbacks(mRepeatUpdateHandler);
                repeatUpdateHandler.post(mRepeatUpdateHandler);

                return false;
            }
        });

そして、ユーザーが指でボタンを離したときに、自動インクリメントを停止したい

increment.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP && autoIncrement) {

                //Stop autoincrement

                repeatUpdateHandler.removeCallbacks(mRepeatUpdateHandler);
                autoIncrement = false;
            }

            return false;
        }
    });

これはハンドラです:

RepetetiveUpdater mRepeatUpdateHandler = new RepetetiveUpdater();
 ....

class RepetetiveUpdater implements Runnable {
    public void run() {
        if (autoIncrement) {
            increment();
            repeatUpdateHandler.postDelayed(new RepetetiveUpdater(),
                    REPEAT_DELAY);
        } else if (autoDecrement) {
            decrement();
            repeatUpdateHandler.postDelayed(new RepetetiveUpdater(),
                    REPEAT_DELAY);
        }
    }
}

しかし、これはユーザーがボタンの上に指を離したときにのみ機能し、画面上の別の場所にドラッグすると、カウンターが実行され続けます。何かアイデアはありますか?

4

3 に答える 3

4

以下の私のコードがあなたがやろうとしていることを正確に実行するかどうかはわかりません。増分メソッドは、ユーザーがクリックを停止するか、指がビューの境界に配置されなくなるまで呼び出されます。すべてはonTouchコールバックで行われます:

    final Rect r = new Rect();
    // this is the platform's default timeout for recognizing a long press
    final long LONG_PRESS_TIMOUT = ViewConfiguration.getLongPressTimeout();
    increment.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            final int action = event.getAction();
            // get the View's Rect relative to its parent
            v.getHitRect(r);
            // offset the touch coordinates with the values from r
            // to obtain meaningful coordinates
            final float x = event.getX() + r.left;
            final float y = event.getY() + r.top;
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                // simulate a long press
                // if the user stops pressing before the long press timeout
                // expires this will be canceled
                repeatUpdateHandler.postDelayed(mRepeatUpdateHandler,
                        LONG_PRESS_TIMOUT);
                break;
            case MotionEvent.ACTION_MOVE:
                // if the touch coordinates are not in the Views' rect then
                // cancel any Runnable
                if (!r.contains((int) x, (int) y)) {
                    repeatUpdateHandler
                            .removeCallbacks(mRepeatUpdateHandler);
                }
                break;
            case MotionEvent.ACTION_UP:
                // the user raised his finger, cancel the Runnable
                repeatUpdateHandler.removeCallbacks(mRepeatUpdateHandler);
                break;
            }
            return false;
        }
    });

そしてそのRunnable部分:

class RepetetiveUpdater implements Runnable {
    public void run() {
        increment();
        repeatUpdateHandler.postDelayed(mRepeatUpdateHandler, 1000);
    }
}

int i = 0;

public void increment() {
    Log.e("INCREMENT", "Value " + (++i));
}
于 2012-09-11T16:00:59.107 に答える
0
@Override
 public boolean onTouch(View view, MotionEvent motionEvent) {
  // TODO Auto-generated method stub

  textX.setText("x: " + String.valueOf(motionEvent.getX()));
  textY.setText("y: " + String.valueOf(motionEvent.getY()));

  int action = motionEvent.getAction();

  switch (action){
  case MotionEvent.ACTION_DOWN:
   textEvent.setText("ACTION_DOWN");      
   break;
  case MotionEvent.ACTION_MOVE:
   textEvent.setText("ACTION_MOVE");
   break;
  case MotionEvent.ACTION_UP:
   textEvent.setText("ACTION_UP");          // you need this!
   break;
  case MotionEvent.ACTION_CANCEL:
   textEvent.setText("ACTION_CANCEL");
   break;
  default:
   textEvent.setText("Unknown!");
  }

  return true; //means event have been processed
 }
于 2012-09-11T11:34:13.240 に答える
0

ボタンに onTouch() または onFocusChange() リスナーを使用して、別の方法でそれを行うことができます。

例:

        button.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            // TODO Auto-generated method stub

        }
    });

    button.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            return false;
        }
    });
于 2012-09-11T11:27:10.617 に答える