From 7f6cd8295c9e369a043d3f3ca6d411267fdd0dbc Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Tue, 28 Apr 2026 10:18:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A3=81=E5=89=AA=E6=A1=86=E8=B7=9F=E9=9A=8F?= =?UTF-8?q?=E7=94=BB=E5=B8=83=E6=8E=A7=E4=BB=B6=E5=90=8C=E6=AD=A5=E7=BC=A9?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加containerScale属性跟踪缩放比例 - setContainerScale()同步缩放比例到裁剪框 - onDraw()中使用canvas.scale()缩放裁剪框绘制 - 角标半径按比例调整 --- gallery/build.properties | 4 +- .../studio/gallery/CropCanvasView.java | 62 +++++++++++++++---- .../studio/gallery/ZoomContainerView.java | 7 +++ 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/gallery/build.properties b/gallery/build.properties index 67efba4..05ddb87 100644 --- a/gallery/build.properties +++ b/gallery/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Apr 28 09:59:23 CST 2026 +#Tue Apr 28 10:15:27 CST 2026 stageCount=7 libraryProject= baseVersion=15.0 publishVersion=15.0.6 -buildCount=33 +buildCount=36 baseBetaVersion=15.0.7 diff --git a/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java b/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java index 13b59fb..4aa8614 100644 --- a/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java +++ b/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java @@ -50,6 +50,7 @@ public class CropCanvasView extends View { private float displayOffsetX = 0f; private float displayOffsetY = 0f; private static final int MAX_DISPLAY_SIZE = 2048; + private float containerScale = 1.0f; public CropCanvasView(Context context) { super(context); @@ -120,6 +121,22 @@ public class CropCanvasView extends View { return displayBitmapScale; } + public void onContainerScaled() { + containerScale = 1.0f; + invalidate(); + } + + public void setContainerScale(float scale) { + if (scale > 0 && scale != containerScale) { + containerScale = scale; + invalidate(); + } + } + + public float getContainerScale() { + return containerScale; + } + public Bitmap getCanvasBitmap() { if (canvasWidth <= 0 || canvasHeight <= 0) { return null; @@ -338,18 +355,41 @@ public class CropCanvasView extends View { canvas.restore(); - canvas.drawRect(cropRect, borderPaint); - canvas.drawCircle(cropRect.left, cropRect.top, 12, cornerPaint); - canvas.drawCircle(cropRect.right, cropRect.top, 12, cornerPaint); - canvas.drawCircle(cropRect.left, cropRect.bottom, 12, cornerPaint); - canvas.drawCircle(cropRect.right, cropRect.bottom, 12, cornerPaint); + if (containerScale != 1.0f) { + canvas.save(); + canvas.scale(containerScale, containerScale); + canvas.drawRect(cropRect, borderPaint); + float cornerRadius = 12f / containerScale; + canvas.drawCircle(cropRect.left, cropRect.top, cornerRadius, cornerPaint); + canvas.drawCircle(cropRect.right, cropRect.top, cornerRadius, cornerPaint); + canvas.drawCircle(cropRect.left, cropRect.bottom, cornerRadius, cornerPaint); + canvas.drawCircle(cropRect.right, cropRect.bottom, cornerRadius, cornerPaint); + canvas.restore(); + } else { + canvas.drawRect(cropRect, borderPaint); + canvas.drawCircle(cropRect.left, cropRect.top, 12, cornerPaint); + canvas.drawCircle(cropRect.right, cropRect.top, 12, cornerPaint); + canvas.drawCircle(cropRect.left, cropRect.bottom, 12, cornerPaint); + canvas.drawCircle(cropRect.right, cropRect.bottom, 12, cornerPaint); + } } else { - canvas.drawRect(cropRect, borderPaint); - - canvas.drawCircle(cropRect.left, cropRect.top, 12, cornerPaint); - canvas.drawCircle(cropRect.right, cropRect.top, 12, cornerPaint); - canvas.drawCircle(cropRect.left, cropRect.bottom, 12, cornerPaint); - canvas.drawCircle(cropRect.right, cropRect.bottom, 12, cornerPaint); + if (containerScale != 1.0f) { + canvas.save(); + canvas.scale(containerScale, containerScale); + canvas.drawRect(cropRect, borderPaint); + float cornerRadius = 12f / containerScale; + canvas.drawCircle(cropRect.left, cropRect.top, cornerRadius, cornerPaint); + canvas.drawCircle(cropRect.right, cropRect.top, cornerRadius, cornerPaint); + canvas.drawCircle(cropRect.left, cropRect.bottom, cornerRadius, cornerPaint); + canvas.drawCircle(cropRect.right, cropRect.bottom, cornerRadius, cornerPaint); + canvas.restore(); + } else { + canvas.drawRect(cropRect, borderPaint); + canvas.drawCircle(cropRect.left, cropRect.top, 12, cornerPaint); + canvas.drawCircle(cropRect.right, cropRect.top, 12, cornerPaint); + canvas.drawCircle(cropRect.left, cropRect.bottom, 12, cornerPaint); + canvas.drawCircle(cropRect.right, cropRect.bottom, 12, cornerPaint); + } } } diff --git a/gallery/src/main/java/cc/winboll/studio/gallery/ZoomContainerView.java b/gallery/src/main/java/cc/winboll/studio/gallery/ZoomContainerView.java index 55aa2bc..7fb4bdb 100644 --- a/gallery/src/main/java/cc/winboll/studio/gallery/ZoomContainerView.java +++ b/gallery/src/main/java/cc/winboll/studio/gallery/ZoomContainerView.java @@ -100,6 +100,13 @@ public class ZoomContainerView extends FrameLayout { public void setScaleFactor(float scale) { scaleFactor = Math.max(minScale, Math.min(scale, maxScale)); + int childCount = getChildCount(); + if (childCount > 0) { + View child = getChildAt(0); + if (child instanceof CropCanvasView) { + ((CropCanvasView) child).setContainerScale(scaleFactor); + } + } requestLayout(); invalidate(); }