6

Android について質問がありますNumberPicker。ユーザーが で Fling を実行している場合、NumberPicker1 ステップごとに ListenerOnValueChangeがトリガーされます。oldVal と newVal が互いに 1 以上異なる可能性があり、Listener が 1 回だけトリガーされるように、これを変更できますか?

前もって感謝します。

編集:コードでより具体的に説明しようとします。

        int diff = Math.abs(newVal - oldVal);

        if (newVal - oldVal > 0) {
            sendMessage(te);
            for (int i = 0; i < diff; i++) {
                sendMessage(plus);
            }
            sendMessage(te);
        } else if (newVal - oldVal < 0) {
            sendMessage(te);
            for (int i = 0; i < diff; i++) {
                sendMessage(minus);
            }
            sendMessage(te);
        } else {
            if (D)
                Log.w(TAG, "This should NEVER happen");
        }

このメソッドは inonValueChange と呼ばれます。メッセージの送信が速すぎて、接続されたデバイスが時間内に反応できません。したがって、何らかの方法でこれを遅くする必要があります。メインスレッドをスリープ状態にせずに、遅くする方法を知っている人はいますか? スリープ中は、その間 GUI 全体が応答しません。私はこれを避けようとします。

ありがとう。

4

1 に答える 1

12

代わりにsetOnValueChangedListenerを使用setOnScrollListenerして、スクロール状態が のときにピッカーの値を取得できますSCROLL_STATE_IDLE。この例を確認してください:

    numberPicker.setOnScrollListener(new NumberPicker.OnScrollListener() {

        private int oldValue;  //You need to init this value.

        @Override
        public void onScrollStateChange(NumberPicker numberPicker, int scrollState) {
            if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_IDLE) {
                //We get the different between oldValue and the new value
                int valueDiff = numberPicker.getValue() - oldValue;

                //Update oldValue to the new value for the next scroll
                oldValue = numberPicker.getValue();

                //Do action with valueDiff
            }
        }
    });

oldValueリスナーの変数の値を初期化する必要があることに注意してください。汎用リスナー (任意の値の配列を受け取ることができる) を作成する必要があるNumberPicker.OnScrollListener場合は、コンストラクターで初期値を実装して受け取るカスタム クラスを作成できます。このようなもの:

    public class MyNumberPickerScrollListener implements NumberPicker.OnScrollListener {

        private int oldValue;

        public MyNumberPickerScrollListener(int initialValue) {
            oldValue = initialValue;
        }

        @Override
        public void onScrollStateChange(NumberPicker numberPicker, int scrollState) {
            if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_IDLE) {
                //We get the different between oldValue and the new value
                int valueDiff = numberPicker.getValue() - oldValue;

                //Update oldValue to the new value for the next scroll
                oldValue = numberPicker.getValue();

                //Do action with valueDiff
            }
        }
    }

詳細については、NumberPicker.onScrollListenerのドキュメントを参照してください。

于 2013-05-16T15:47:25.123 に答える