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