Как изменить размер вида с 4-х сторон в Android? - PullRequest
0 голосов
/ 16 декабря 2018

Можно ли изменить размер, потянув матрицу на 4-х сторонах вида?Я могу изменить размер от одной точки до такого отношения.

Resize View

Пример выше работает следующим образом:

protected boolean onTouchDown(@NonNull MotionEvent event) {
  oldDistance = (float) Math.sqrt((midPoint.x-event.getX()) * (midPoint.x-event.getX()) + (midPoint.y-event.getY()) * (midPoint.y-event.getY()));
...
}

float newDistance = (float) Math.sqrt((midPoint.x-event.getX()) * (midPoint.x-event.getX()) + (midPoint.y-event.getY()) * (midPoint.y-event.getY()));
moveMatrix.set(downMatrix);
moveMatrix.postScale(newDistance / oldDistance, newDistance / oldDistance, midPoint.x,
        midPoint.y);
handlingSticker.setMatrix(moveMatrix);

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

first second

1 Ответ

0 голосов
/ 26 декабря 2018

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

1 Первое прикосновение было рядом с «вертикальной» границей вашего вида.Чем прокрутка является горизонтальной (ось х).В противном случае его вертикаль (ось Y).

2 Если у вас есть кнопки для перетаскивания, как на скриншоте, это еще проще: вам просто нужно запомнить, с какими кнопками был начат масштаб.

protected boolean onTouchDown(@NonNull MotionEvent event) {
  oldDistance = (float) Math.sqrt((midPoint.x-event.getX()) * (midPoint.x-event.getX()) + (midPoint.y-event.getY()) * (midPoint.y-event.getY()));
...
}

boolean isHorizonalScale = ... // Check if the drag has been started on the "vertical" side. If no, the scale is vertical.

moveMatrix.set(downMatrix);

if (isHorizonalScale) {
    float newDistance = (float) Math.abs(midPoint.x-event.getX());
    moveMatrix.postScale(newDistance / oldDistance, 1, midPoint.x, midPoint.y);
} else if (isHorizonalScale) {
    float newDistance = (float) Math.abs(midPoint.y-event.getY());
    moveMatrix.postScale(1, newDistance / oldDistance, midPoint.x, midPoint.y);
}
handlingSticker.setMatrix(moveMatrix);
...