Я реализую приложение для рисования, в котором мне нужно разместить текст, размер которого можно изменять с помощью жестов сжатия. Я создал для этого специальный вид и получил расстояние между двумя пальцами (указателями). Затем масштаб был скорректирован в соответствии с изменением этого интервала.
Для получения масштаба по интервалу я попробовал два метода:
(1) Экспоненциальный: https://i.stack.imgur.com/HpppK.jpg
Код (находится внутри метода onTouchEvent (event) представления):
switch (event.getActionMasked()) {
case MotionEvent.ACTION_POINTER_DOWN:
prevSpacing = spacing(event);
break;
case MotionEvent.ACTION_MOVE:
if (event.getPointerCount() == 2) {
float currentSpacing = spacing(event);
float diff = currentSpacing / prevSpacing;
scaleFactor *= diff;
scaleFactor = Math.max(Math.min(scaleFactor, 5f), 0.2f);
setScaleX(scaleFactor);
setScaleY(scaleFactor);
}
break;
(2) Относительный: https://i.stack.imgur.com/Eckel.jpg
КОД: (разница отмечена с помощью >> <<) </p>
switch (event.getActionMasked()) {
case MotionEvent.ACTION_POINTER_DOWN:
prevSpacing = spacing(event);
break;
case MotionEvent.ACTION_MOVE:
if (event.getPointerCount() == 2) {
float currentSpacing = spacing(event);
float diff = currentSpacing / prevSpacing;
// >>
prevSpacing = currentSpacing;
// <<
scaleFactor *= diff;
scaleFactor = Math.max(Math.min(scaleFactor, 5f), 0.2f);
setScaleX(scaleFactor);
setScaleY(scaleFactor);
}
break;
Метод интервала следующий:
private float spacing(MotionEvent event) {
double delta_x = (event.getX(0) - event.getX(1));
double delta_y = (event.getY(0) - event.getY(1));
float diff = (float) Math.sqrt(Math.pow(delta_x, 2) + Math.pow(delta_y, 2));
return diff;
}
По мне, второй метод (относительный) должен работать, а первый не должен, как видно из моих документов. Однако второй метод вызывает дрожание с резким увеличением и уменьшением масштаба при масштабировании, а первый метод работает без сбоев. Почему это так?
Вопросы по теме: (1): Как меняются границы представления и значения getX (), getY () при масштабировании, повороте и переводе представления?