Intereting Posts
Приложение не открывает основную деятельность, когда оно было убито после нажатия кнопки «домой» в андроиде Внедрение Circular ViewPager Вызов метода MainActivity из других классов (которые расширяют широковещательный приемник) Доступен ли QT для платформ Android и iPhone? Уникальный идентификатор для SMS и контактов (для проверки дублирования) в Android Как загрузить приложение из Eclipse на Android-телефон вместо AVD Проверка того, изменились ли полевые данные, а не какое-либо поле в дочерних данных Android Multi Touch масштабирование Кликируемые Полилинии Google Maps API Android Android – Как программно изменить режим timepicker? Cordova 3.0 FileWriter THREAD WARNING: exec () вызов File.write заблокировал основной поток … должен использовать CordovaInterface.getThreadPool () Как запустить тесты на фрагмент действия Установить размер камеры – параметры против намерения? XAPK Проверка файлов показывает правильные данные Информация NullPointerException в CustomArrayAdapter

Усиление холста для увеличения масштаба (точка поворота)

Я рисую строки на пользовательском представлении и добавляю функции панорамирования и масштабирования. Проблема в том, что когда я увеличиваю масштаб с помощью двух пальцев, средние точки вычисляются правильно, но когда я делаю matrix.scale(scaleFactor, scaleFactor, midX, midY ), холст прыгает (переводится) в midX и midY которые были раньше.

Позвольте мне понять это прямо:

Я инициализирую среднюю точку между моими пальцами с помощью 0/0. Как только второй указатель находится на экране, я вычисляю среднюю точку и аннулирую значение onDraw. Затем чертеж перескакивает (переводится) в последнюю известную среднюю точку и начинает увеличиваться. Я не хочу, чтобы рисунок был переведен в среднюю точку, а не просто увеличивался до выбранной средней точки.

Вот соответствующие фрагменты кода:

Метод onDraw

 private float startX = 0f; private float startY = 0f; private float translateX; private float translateY; private float previousTranslateX = 0f; private float previousTranslateY = 0f; private float midX = 0f; private float midY = 0f; ... public void onDraw(Canvas canvas) { super.onDraw(canvas); cx = canvas.getWidth(); cy = canvas.getHeight(); mat.reset(); canvas.save(); int count = 0; mat.postScale(scaleFactor, -scaleFactor, midX, midY); mat.postTranslate(translateX, translateY); canvas.setMatrix(mat); // draw stuff here... canvas.restore(); } 

Метод onTouch

 public boolean onTouchEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: mode = DRAG; startX = event.getX() - previousTranslateX; startY = event.getY() - previousTranslateY; break; case MotionEvent.ACTION_MOVE: if (event.getPointerCount() > 1) { mode = ZOOM; } else { translateX = event.getX() - startX; translateY = event.getY() - startY; } break; case MotionEvent.ACTION_POINTER_DOWN: mode = NONE; getMidPoint(event); break; case MotionEvent.ACTION_UP: mode = NONE; previousTranslateX = translateX; previousTranslateY = translateY; break; case MotionEvent.ACTION_POINTER_UP: mode = DRAG; previousTranslateX = translateX; previousTranslateY = translateY; break; } detector.onTouchEvent(event); if ((mode == DRAG) || mode == ZOOM) { invalidate(); } return true; } 

Расчет средней точки

 private void getMidPoint(MotionEvent event) { //get offset screensize -> canvas int offX = sx-cx; int offY = sy-cy; //get finger coordinates relative to offset f1x = event.getX(0)+offX; f1y = event.getY(0)+offY; f2x = event.getX(1)+offX; f2y = event.getY(1)+offY; midX = (f1x + f2x)/2; midY = (f1y + f2y)/2; //because my points are in a local coordinate system the screen coordinates need to be mapped to current canvas matrix Matrix m = new Matrix(mat); m.invert(m); float[] touch = new float[] { midX, midY }; m.mapPoints(touch); midX = touch[0]; midY = touch[1]; } 

Вот несколько фотографий: Это когда начинается действие. Красная точка отмечает позицию 0/0 инициализированной средней точки

Как только поместите мои пальцы в голубые точки и начните масштабирование:

Это будет результат. Это происходит, как только я начинаю увеличивать.

Я бы очень признателен, если у кого-то есть ответ для меня! Заранее спасибо.