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 2

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;
    }
  }

Решается следующим образом:

  1. рисуйте на ACTION_UP и ACTION_MOVE вместо ACTION_DOWN
  2. на ACTION_MOVE не рисуйте сразу, вместо этого поместите точки в буфер (это позволит убедиться, что вы не интерпретируете случайные события одного касания до того, как произойдет событие мультитач)
  3. Как только буфер имеет 3 точки, запустите режим рисования
  4. Как только произойдет событие ACTION_POINTER_DOWN (произошло мультитач), очистите буфер и начните масштабирование режим

Это лучшее, что я мог сделать. Результат довольно убедителен...