如何在Android中从四个方向改变视图大小?

12

是否可以通过拖动视图的四个边缘来改变大小?我可以从单个点调整大小到像这样的比例。

调整视图大小

上面的示例工作方式如下:

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);

比如说,我要怎么用矩阵让右侧的过程变成下面这样的图片展开呢?

第一张 第二张


你想从所有方向增加图片的大小吗?还是你想要类似于只从一侧增加大小的屏幕截图结果? - Anmol
嗨@Anmol,我想只从一侧增加大小。每个方向的增长不会相等。 - Umut ADALI
不,这不是视图。贴纸代码在这里-> https://github.com/wuapnjie/StickerView/blob/master/sticker/src/main/java/com/xiaopo/flying/sticker/Sticker.java - Umut ADALI
@BhavenShah 我没有找到任何解决方案。 - Bhaumik Ghodasara
@UmutADALI,你有找到任何解决方案吗?请分享一下。如果你找到了。 - Anand Savjani
显示剩余6条评论
2个回答

4
您可以尝试以下方法。思路是,如果您只有水平或垂直比例尺,则必须为所需轴提供实际比例尺,而另一个轴则为1。检查比例尺是水平还是垂直有点棘手,您可以检查以下两种情况之一:
1. 第一个触摸接近视图的“垂直”边界。然后滚动是水平的(x轴)。否则它是垂直的(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);

1
是的,这很好,但它的工作方式类似于增加高度和宽度。也就是说,如果我旋转贴纸然后再次调整大小,那么它将无法正常工作或者说不符合我的要求。 - Bhaven Shah
我同意@BhavenShah的说法。它是有效的,但如果您旋转,所有的放大或缩小都会反转。如果我们能解决这个问题,我将接受这个答案。 - Umut ADALI

-1

将moveMatrix.postScale(newDistance / oldDistance, 1, midPoint.x, midPoint.y); 改为 moveMatrix.preScale(newDistance / oldDistance, 1);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接