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

Я рисую строки на пользовательском представлении и добавляю функции панорамирования и масштабирования. Проблема в том, что когда я увеличиваю масштаб с помощью двух пальцев, средние точки вычисляются правильно, но когда я делаю 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 инициализированной средней точки

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

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

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

Intereting Posts
Фрагмент вращения экрана Как наложить наложение Открыть панель действий Шерлок Собирать дубликаты файлов во время упаковки – messages.properties от JodaTime RecyclerView 23.2.x height = 0dp вызывает onBind вызывает все элементы и scrollToPosition не работает Изменение изображения кнопки изображения до нажатия Линия рисования OpenGL ES 2.0 на основе движения, линия всегда начинается с начала координат API Google Android для Android v2 выбрасывает GooglePlayServicesNotAvailableException, устаревший, SupportMapFragment.getMap () возвращает null Сбой данных с помощью NoSuchMethodError Android WebView оставляет пространство для полосы прокрутки Как добавить пользовательский адаптер в AutoCompleteTextView Поддержка Android NDK C ++ 'wstring' Android – MediaPlayer на Prepare Called еще до того, как поток подготовлен на Android 4.0+ Доступные ссылки и меню копирования / вставки в EditView в Android Удержание сертификата в Android Как включить http-библиотеку в Android Project с использованием предварительного просмотра M в сборке Eclipse ant