2014-09-20 2 views
1

Есть ли способы реализации плавного масштабирования для увеличения без использования матрицы?Любые способы сделать щепотку для увеличения гладкости

Я создаю приложение для рисования, и я хочу, чтобы он имел щепотку для увеличения.

я получаю точку опоры для масштабирования с:

centerposX = mScaleDetector.getFocusX(); 
centerposY = mScaleDetector.getFocusY(); 

и для масштабирования, то я использую:

canvas.scale(scaleFactor, scaleFactor, centerposX, centerposY); 

Но проблема в том, что он сразу же центры зрения в точке поворота и их масштабирование его , а не использовать его в качестве ориентира для центрирования.

Я видел, что эта проблема была решена с использованием матрицы, но я не хочу использовать их, поскольку мне нужно отслеживать смещения, ZoomTranslations, которые вычисляются из centerposX/Y и scaleFactor, чтобы нарисовать рисунки, где они принадлежат экрану.

Итак, есть ли способ решить эту проблему с точкой поворота плавно?

Спасибо!

+0

Как Canvas.scale center a View? и что случилось с Матрицей, я не понял ваши объяснения ... – pskink

+0

Я имел в виду, что при касании мой видовой экран мгновенно переходит в точку касания. и я хочу реализовать браузер, как прижим для увеличения. И я не хочу использовать матрицы, потому что рисование на масштабированном экране требует отслеживания множества переменных, и я не уверен, как я буду обращаться с ними с матрицами. В любом случае, если нет никаких решений для решения этого «прыгающего» поведения, я перепишу свой код. – user3482211

+0

Итак, я попытался сделать все с помощью матрицы. Масштабирование работает как шарм. Но есть одна проблема, рисунки пальцев снова становятся неуместными, когда они нарисованы, и они не масштабируются должным образом. – user3482211

ответ

1

Через неделю я понял, что мне нужно использовать матрицу и получить абсолютные координаты на экране, так что я использовал детектор Жест установить матрицу шкалы

matrix.postScale(mScaleFactor, mScaleFactor, focusX, focusY); 

В моей OnDraw метод, который я использовал canvas.concat(matrix); так не только Bitmap , но весь холст ПОЛУЧИТЬ в матрице преобразования, и получить реальные координаты экрана, я использовал метод я нашел на стек-переливе:

public float[] getAbsolutePosition(float Ax, float Ay) { 
     matrix.getValues(m); 

     float x = width - ((m[Matrix.MTRANS_X] - Ax)/m[Matrix.MSCALE_X]) 
       - (width - getTranslationX()); 

     float y = height - ((m[Matrix.MTRANS_Y] - Ay)/m[Matrix.MSCALE_X]) 
       - (height - getTranslationY()); 

     return new float[] { x, y }; 
    } 

Я называю это каждый раз, когда в моем onTouchEvent() метод, поставляя event.getX и событие .getY() в качестве аргументов.

После этого все простое peasy, также из-за этого прекрасного метода я избавился от ~ 4-5 переменных, которые мне пришлось использовать, чтобы найти реальное местоположение касания.

+0

или самым простым обходным путем является прослушивание касания родительского представления, которое не масштабируется –

Смежные вопросы