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 e60ccca..68e9b03 100644 --- a/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java +++ b/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java @@ -104,6 +104,12 @@ public class CropActivity extends AppCompatActivity { @Override public void onBackgroundColorChanged(int color) { colorView.setBackgroundColor(color); + } + }); + + cropCanvasView.setOnColorPickedListener(new CropCanvasView.OnColorPickedListener() { + @Override + public void onColorPicked(int color) { cropCanvasView.setColorPickMode(false); btnColorPick.setAlpha(1.0f); } 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 fdcc8c1..9053108 100644 --- a/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java +++ b/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java @@ -16,11 +16,20 @@ public class CropCanvasView extends View { void onBackgroundColorChanged(int color); } + public interface OnColorPickedListener { + void onColorPicked(int color); + } + private OnBackgroundColorChangedListener backgroundColorChangedListener; + private OnColorPickedListener colorPickedListener; public void setOnBackgroundColorChangedListener(OnBackgroundColorChangedListener listener) { this.backgroundColorChangedListener = listener; } + + public void setOnColorPickedListener(OnColorPickedListener listener) { + this.colorPickedListener = listener; + } private Paint imagePaint; private Paint borderPaint; private Paint cornerPaint; @@ -55,6 +64,7 @@ public class CropCanvasView extends View { private float initialSpan; private int backgroundColor = Color.BLUE; private boolean colorPickMode = false; + private int previewColor = 0; private float pickX, pickY; private float displayScale = 1.0f; @@ -465,12 +475,40 @@ public class CropCanvasView extends View { 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); + int bmpX = (int) ((imgX - imageBounds.left) * displayBitmapScale); + int bmpY = (int) ((imgY - imageBounds.top) * 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); + previewColor = originalBitmap.getPixel(bmpX, bmpY); + if (backgroundColorChangedListener != null) { + backgroundColorChangedListener.onBackgroundColorChanged(previewColor); + } + } + return true; + } + if (event.getAction() == MotionEvent.ACTION_MOVE) { + if (originalBitmap != null && !originalBitmap.isRecycled()) { + float imgX = screenToImageX(x); + float imgY = screenToImageY(y); + int bmpX = (int) ((imgX - imageBounds.left) * displayBitmapScale); + int bmpY = (int) ((imgY - imageBounds.top) * displayBitmapScale); + bmpX = Math.max(0, Math.min(bmpX, originalBitmap.getWidth() - 1)); + bmpY = Math.max(0, Math.min(bmpY, originalBitmap.getHeight() - 1)); + previewColor = originalBitmap.getPixel(bmpX, bmpY); + if (backgroundColorChangedListener != null) { + backgroundColorChangedListener.onBackgroundColorChanged(previewColor); + } + } + return true; + } + if (event.getAction() == MotionEvent.ACTION_UP) { + if (previewColor != 0) { + backgroundColor = previewColor; + if (colorPickedListener != null) { + colorPickedListener.onColorPicked(backgroundColor); + } + previewColor = 0; + invalidate(); } return true; }