Изменить значение плавно увеличивая скорость, удерживая нажатой кнопку - PullRequest
2 голосов
/ 23 ноября 2011

Я парил над этим несколько дней назад.Я пытаюсь иметь селектор для большого диапазона чисел ... в пределах int.Вы должны удерживать кнопку, и значение должно меняться медленно, и чем дольше вы нажимаете, тем быстрее оно меняется.Вы все знаете такую ​​кнопку, не так ли?: D Он должен быть точным, но быстро вводить номер.Я использую OnTouchListener.Событие позволяет .getDownTime().

Я много пробовал, но всегда получал только пропуск чисел (не очень, но слишком быстрых в использовании) или повторное увеличение значения при удерживании кнопки.Если бегать без изменений, это довольно быстро, но было бы неплохо, если бы он начал делать 10 100 или 1000 прыжков, если он удерживается достаточно долго.

Я подготовил небольшой SSCCE, похожий на этот:

Screenshot of SSCCE

public class ValueChangerSSCCE extends Activity implements OnTouchListener {

Button plusButton;
TextView valueView;
Button minusButton;
int value;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    plusButton = new Button(this);
    plusButton.setText("+");
    plusButton.setTextSize(120f);
    plusButton.setOnTouchListener(this);
    layout.addView(plusButton);

    valueView = new TextView(this);
    valueView.setGravity(Gravity.CENTER_HORIZONTAL);
    valueView.setTextColor(Color.WHITE);
    valueView.setText(value + "");
    valueView.setTextSize(120f);
    layout.addView(valueView);

    minusButton = new Button(this);
    minusButton.setText("-");
    minusButton.setTextSize(120f);
    minusButton.setOnTouchListener(this);
    layout.addView(minusButton);

    setContentView(layout);
}

/* 
 * Called when a button is pressed
 */
@Override
public boolean onTouch(View v, MotionEvent event) {

    if (v == plusButton) {
        value++;
    } else if (v == minusButton) {
        value--;
    }
    valueView.setText(value + "");

    return false;
}
}

Для устройств с низким разрешением может потребоваться уменьшить размеры текста.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Взгляните на исходный код NumberPicker . Это виджет из SDK, который делает именно то, что вы описываете, кроме как без ускорения. Использование почтовых вызовов на Handler, как это сделано здесь, является лучшим способом обработки событий синхронизации. Единственное добавление, которое вам нужно сделать в этом классе, - это изменить значение mSpeed в обратных вызовах (и, возможно, приращении) в зависимости от времени простоя.

НТН.

1 голос
/ 23 ноября 2011

Используйте значение getDownTime(), чтобы вычислить, насколько большим должно быть увеличение счетчика.

Сначала создайте кривую отклика, которую вы хотели бы. (То есть определите функцию, которая определяет, как значение должно изменяться как функция времени прикосновения и, возможно, начального значения. Это не & mdash; не так, как вы описываете это - функция прямой линии)

Тогда просто сделайте свой шаг, следуя кривой. Вероятно, это поможет сохранить значение кнопки и время простоя при последнем событии.

1 голос
/ 23 ноября 2011

Я могу попытаться решить эту проблему следующим образом:

Нажатие + или - запустит тему. Поток обновляет число с заданным интервалом на величину смещения, если число изменилось более чем в 20 раз, то уменьшите интервал, чтобы число обновлялось быстрее, если число все еще сильно меняется, тогда значение смещения будет увеличено пропустить номера. Помните, что все это происходит в потоке.

Когда пользователь поднимает палец, нить прерывается и смещение, интервал сбрасывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...