android: Как уменьшить масштаб без нажатия кнопки (действие вниз)
В настоящее время у меня есть масштабирование, реализованное для моего приложения рисования, которое работает довольно хорошо. Просто несколько строк, чтобы вы знали, о чем я говорю:
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent rawEvent) {
WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
drawSomethingHere();
case MotionEvent.ACTION_POINTER_DOWN:
startZoomingModeHere();
...
Итак, что я хочу: нарисовать одним пальцем, увеличить двумя пальцами. Проблема в том, что всегда есть событие ACTION_DOWN, срабатывающее до того, как второй палец коснется поверхности. Поэтому каждый раз, когда я хочу увеличить масштаб, мое приложение рисует точку до запуска режима масштабирования.
Есть ли у кого-нибудь идея, как это решить?
2 ответа:
Я думаю, что вы должны подождать несколько миллисекунд, прежде чем начать рисовать, потому что невозможно положить ровно два пальца в одну и ту же миллисекунду.
Вы могли бы иметь логический var, чтобы ждать.
Boolean boolean_pointer_down = false;
switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: // Start a thread to call drawSomethingHere in 300 - 700 milliseconds // if action_pointer_down haven’t been called. new ThreadDraw().start(); case MotionEvent.ACTION_POINTER_DOWN: boolean_pointer_down=true; startZoomingModeHere(); .... //Method run in the thread public void run(){ wait(300); //if the user didn't put more fingers in 300 ms he's not going to zoom if (!boolean_pointer_down){ drawSomethingHere(); boolean_pointer_down = false; } }
Решается следующим образом:
- рисуйте на ACTION_UP и ACTION_MOVE вместо ACTION_DOWN
- на ACTION_MOVE не рисуйте сразу, вместо этого поместите точки в буфер (это позволит убедиться, что вы не интерпретируете случайные события одного касания до того, как произойдет событие мультитач)
- Как только буфер имеет 3 точки, запустите режим рисования
- Как только произойдет событие ACTION_POINTER_DOWN (произошло мультитач), очистите буфер и начните масштабирование режим
Это лучшее, что я мог сделать. Результат довольно убедителен...