问题
Is it possible to resize by pulling the matrix on the 4 side of the view? I can resize from a single point to a ratio like this.
The example above works as follows:
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);
But, for example, how can I make the process of expanding on the right side like below pictures with matrix?
回答1:
You can try following. The idea is, if you have only horizontal or only vertical scale, then you must provide actual scale for desired axis and 1 for the other axis. Checking if the scale is horizontal or vertical is a bit tricky, you can check either:
1 The first touch was near the "vertical" border of your view. Than scroll is horizontal (x axis). Otherwise its vertical (y axis).
2 If you have buttons to drag from as in the screenshot, this makes things even easier: you just need to remember which buttons the scale was initiated with.
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);
来源:https://stackoverflow.com/questions/53806006/how-to-change-views-size-from-4-side-in-android