Android: как увеличить масштаб без нажатия кнопки (ACTION_DOWN) - PullRequest
2 голосов
/ 20 ноября 2011

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

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 ]

0 голосов
/ 07 декабря 2011

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

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

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

0 голосов
/ 20 ноября 2011

Я думаю, вам следует подождать несколько миллисекунд, прежде чем начинать рисовать, потому что невозможно поставить ровно два пальца в одну и ту же миллисекунду.

логическое значение 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;
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...