From 474ddcbb3b7e4c29db3bab61b42214e5b8834e94 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Tue, 28 Apr 2026 12:35:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=89=AA=E8=A3=81=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E9=A2=9C=E8=89=B2=E6=8B=BE=E5=8F=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在工具栏添加颜色图标显示当前背景颜色 - 添加背景颜色变化监听器 - 修复画布放大时颜色拾取坐标计算 - 拾取颜色后自动退出拾取模式 --- .../winboll/studio/gallery/CropActivity.java | 13 +++++++++ .../studio/gallery/CropCanvasView.java | 28 ++++++++++++++++--- .../src/main/res/drawable/bg_color_circle.xml | 6 ++++ .../res/drawable/bg_color_circle_border.xml | 6 ++++ gallery/src/main/res/layout/activity_crop.xml | 21 ++++++++++++++ .../src/main/res/layout/item_color_icon.xml | 20 +++++++++++++ 6 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 gallery/src/main/res/drawable/bg_color_circle.xml create mode 100644 gallery/src/main/res/drawable/bg_color_circle_border.xml create mode 100644 gallery/src/main/res/layout/item_color_icon.xml diff --git a/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java b/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java index b68daca..e60ccca 100644 --- a/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java +++ b/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java @@ -98,6 +98,19 @@ public class CropActivity extends AppCompatActivity { }); cropCanvasView = findViewById(R.id.crop_canvas_view); + + final View colorView = findViewById(R.id.color_view); + cropCanvasView.setOnBackgroundColorChangedListener(new CropCanvasView.OnBackgroundColorChangedListener() { + @Override + public void onBackgroundColorChanged(int color) { + colorView.setBackgroundColor(color); + cropCanvasView.setColorPickMode(false); + btnColorPick.setAlpha(1.0f); + } + }); + + colorView.setBackgroundColor(cropCanvasView.getBackgroundColor()); + loadImage(); } 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 92285c9..fdcc8c1 100644 --- a/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java +++ b/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java @@ -12,6 +12,15 @@ import android.view.MotionEvent; import android.view.View; public class CropCanvasView extends View { + public interface OnBackgroundColorChangedListener { + void onBackgroundColorChanged(int color); + } + + private OnBackgroundColorChangedListener backgroundColorChangedListener; + + public void setOnBackgroundColorChangedListener(OnBackgroundColorChangedListener listener) { + this.backgroundColorChangedListener = listener; + } private Paint imagePaint; private Paint borderPaint; private Paint cornerPaint; @@ -39,6 +48,8 @@ public class CropCanvasView extends View { private RectF imageBounds = new RectF(); private RectF canvasBounds = new RectF(); private Bitmap originalBitmap; + private Bitmap canvasBitmap; + private float bitmapScale = 1.0f; private Bitmap displayBitmap; private RectF initialSpanRect; private float initialSpan; @@ -239,6 +250,9 @@ public class CropCanvasView extends View { public void setBackgroundColor(int color) { this.backgroundColor = color; + if (backgroundColorChangedListener != null) { + backgroundColorChangedListener.onBackgroundColorChanged(color); + } invalidate(); } @@ -448,10 +462,16 @@ public class CropCanvasView extends View { if (colorPickMode) { if (event.getAction() == MotionEvent.ACTION_DOWN) { - pickX = x; - pickY = y; - int color = getColorAt(x, y); - setBackgroundColor(color); + if (originalBitmap != null && !originalBitmap.isRecycled()) { + float imgX = screenToImageX(x); + float imgY = screenToImageY(y); + int bmpX = (int) ((imgX - imageBounds.left) / displayScale * displayBitmapScale); + int bmpY = (int) ((imgY - imageBounds.top) / displayScale * displayBitmapScale); + bmpX = Math.max(0, Math.min(bmpX, originalBitmap.getWidth() - 1)); + bmpY = Math.max(0, Math.min(bmpY, originalBitmap.getHeight() - 1)); + int color = originalBitmap.getPixel(bmpX, bmpY); + setBackgroundColor(color); + } return true; } return true; diff --git a/gallery/src/main/res/drawable/bg_color_circle.xml b/gallery/src/main/res/drawable/bg_color_circle.xml new file mode 100644 index 0000000..a9fbe48 --- /dev/null +++ b/gallery/src/main/res/drawable/bg_color_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/gallery/src/main/res/drawable/bg_color_circle_border.xml b/gallery/src/main/res/drawable/bg_color_circle_border.xml new file mode 100644 index 0000000..cc52daa --- /dev/null +++ b/gallery/src/main/res/drawable/bg_color_circle_border.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/gallery/src/main/res/layout/activity_crop.xml b/gallery/src/main/res/layout/activity_crop.xml index 809df2b..ca85d7c 100644 --- a/gallery/src/main/res/layout/activity_crop.xml +++ b/gallery/src/main/res/layout/activity_crop.xml @@ -21,6 +21,27 @@ android:src="@drawable/ic_close" android:background="?attr/selectableItemBackgroundBorderless"/> + + + + + + + + + + + + + + + \ No newline at end of file