diff --git a/changes.md b/changes.md index ca0993a2841a7ad8bc088f025477d502538b5b5f..dd24169d6c53e3a9847426bcfa096ac5bf82951b 100644 --- a/changes.md +++ b/changes.md @@ -1,4 +1,7 @@ ### V5.4 -* 优化交互逻辑 -* 支持左旋转 \ No newline at end of file +* IDoodleItem支持缩放功能 +* 放大镜模式下增加全图预览的功能 +* 增加新的画笔:马赛克 +* 支持左旋转 +* 优化交互逻辑 \ No newline at end of file diff --git a/doodle/src/main/java/cn/hzw/doodle/DoodleView.java b/doodle/src/main/java/cn/hzw/doodle/DoodleView.java index 4cfcf015f2142d3e8a385a00fcd934d164ad9bdb..330381b3ebf0712228acccb5b1c24bc055b82bc2 100644 --- a/doodle/src/main/java/cn/hzw/doodle/DoodleView.java +++ b/doodle/src/main/java/cn/hzw/doodle/DoodleView.java @@ -13,8 +13,6 @@ import android.os.Looper; import android.view.MotionEvent; import android.view.View; -import junit.framework.Assert; - import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,6 +28,7 @@ import cn.hzw.doodle.core.IDoodleShape; import cn.hzw.doodle.core.IDoodleTouchDetector; import static cn.hzw.doodle.util.DrawUtil.drawCircle; +import static cn.hzw.doodle.util.DrawUtil.drawRect; import static cn.hzw.doodle.util.DrawUtil.rotatePoint; /** @@ -79,11 +78,12 @@ public class DoodleView extends View implements IDoodle { private float mTouchX, mTouchY; private boolean mEnableZoomer = false; // 放大镜功能 + private boolean mEnableOverview = true; // 全图预览功能,建立在放大镜功能开启的前提下 private float mLastZoomerY; private float mZoomerRadius; private Path mZoomerPath; private float mZoomerScale = 0; // 放大镜的倍数 - private Paint mZooomerPaint; + private Paint mZooomerPaint, mZoomerTouchPaint; private int mZoomerHorizonX; // 放大器的位置的x坐标,使其水平居中 private boolean mIsScrollingDoodle = false; // 是否正在滑动,只要用于标志触摸时才显示放大镜 @@ -139,6 +139,12 @@ public class DoodleView extends View implements IDoodle { mZooomerPaint.setStrokeCap(Paint.Cap.ROUND);// 圆滑 mZooomerPaint.setStrokeWidth(Util.dp2px(getContext(), 10)); + mZoomerTouchPaint = new Paint(); + mZoomerTouchPaint.setStyle(Paint.Style.STROKE); + mZoomerTouchPaint.setAntiAlias(true); + mZoomerTouchPaint.setStrokeJoin(Paint.Join.ROUND); + mZoomerTouchPaint.setStrokeCap(Paint.Cap.ROUND);// 圆滑 + mDefaultTouchDetector = defaultDetector; mInner = new DoodleViewInner(); @@ -311,7 +317,9 @@ public class DoodleView extends View implements IDoodle { if (mIsScrollingDoodle && mEnableZoomer && mZoomerScale > 0) { //启用放大镜 canvas.save(); - if (mTouchY <= mZoomerRadius * 2) { // 在放大镜的范围内, 把放大镜仿制底部 + float unitSize = getUnitSize(); + + if (mTouchY <= mZoomerRadius * 2) { // 在放大镜的范围内, 把放大镜放在底部 mLastZoomerY = getHeight() - mZoomerRadius * 2; } else if (mTouchY >= getHeight() - mZoomerRadius * 2) { mLastZoomerY = 0; @@ -327,11 +335,52 @@ public class DoodleView extends View implements IDoodle { // draw inner canvas.rotate(mDoodleRotateDegree, getWidth() / 2, getHeight() / 2); mInner.onDraw(canvas); + + // 触摸点 + float left = getAllTranX(); + float top = getAllTranY(); + // 画布和图片共用一个坐标系,只需要处理屏幕坐标系到图片(画布)坐标系的映射关系 + canvas.translate(left, top); // 偏移画布 + scale = getAllScale(); + canvas.scale(scale, scale); // 缩放画布 + mZoomerTouchPaint.setStrokeWidth(getUnitSize()); + mZoomerTouchPaint.setColor(0xaa000000); + drawCircle(canvas, toX(mTouchX), toY(mTouchY), mSize / 2, mZoomerTouchPaint); + mZoomerTouchPaint.setColor(0xaaffffff); + drawCircle(canvas, toX(mTouchX), toY(mTouchY), mSize / 2 - unitSize / 4, mZoomerTouchPaint); + canvas.restore(); // 画放大器的边框 drawCircle(canvas, mZoomerRadius, mZoomerRadius, mZoomerRadius, mZooomerPaint); canvas.restore(); + + // overview + canvas.save(); + canvas.translate(mZoomerHorizonX, mLastZoomerY); + scale = (mZoomerRadius / 2) / getWidth(); + canvas.scale(scale, scale); + float strokeWidth = 1 / scale; + canvas.clipRect(-strokeWidth, -strokeWidth, getWidth() + strokeWidth, getHeight() + strokeWidth); + canvas.drawColor(0x88888888); + canvas.save(); + canvas.rotate(mDoodleRotateDegree, getWidth() / 2, getHeight() / 2); + float tempScale = mScale; + float tempTransX = mTransX; + float tempTransY = mTransY; + mScale = 1; + mTransX = mTransY = 0; + mInner.onDraw(canvas); + mScale = tempScale; + mTransX = tempTransX; + mTransY = tempTransY; + canvas.restore(); + mZoomerTouchPaint.setStrokeWidth(strokeWidth); + mZoomerTouchPaint.setColor(0xaa000000); + drawRect(canvas, 0, 0, getWidth(), getHeight(), mZoomerTouchPaint); + mZoomerTouchPaint.setColor(0xaaffffff); + drawRect(canvas, strokeWidth, strokeWidth, getWidth() - strokeWidth, getHeight() - strokeWidth, mZoomerTouchPaint); + canvas.restore(); } } @@ -837,6 +886,22 @@ public class DoodleView extends View implements IDoodle { return mEnableZoomer; } + /** + * 设置是否开启全图预览功能,开启后可以在放大镜功能下显示全图涂鸦 + * @param enableOverview + */ + public void enableOverview(boolean enableOverview) { + mEnableOverview = enableOverview; + } + + /** + * 是否开启全图预览功能 + * @return + */ + public boolean isEnableOverview() { + return mEnableOverview; + } + /** * 是否正在滚动涂鸦,只要用于标志触摸时才显示放大镜 * diff --git a/doodle/src/main/res/drawable-xxhdpi/doodle_ic_mosaic.png b/doodle/src/main/res/drawable-xxhdpi/doodle_ic_mosaic.png new file mode 100644 index 0000000000000000000000000000000000000000..234c079e41e8786730e0e57644c13686097d82d0 Binary files /dev/null and b/doodle/src/main/res/drawable-xxhdpi/doodle_ic_mosaic.png differ diff --git a/doodle/src/main/res/layout/doodle_layout.xml b/doodle/src/main/res/layout/doodle_layout.xml index 58236241d3177150d285714022de9621a5325974..fc3ea2fdca359218f93f44f318c6baf6297ae276 100644 --- a/doodle/src/main/res/layout/doodle_layout.xml +++ b/doodle/src/main/res/layout/doodle_layout.xml @@ -63,7 +63,7 @@ android:background="@drawable/doodle_btn_effect_round" android:onClick="onClick" android:scaleType="centerInside" - android:src="@drawable/doodle_ic_texture" + android:src="@drawable/doodle_ic_mosaic" android:visibility="visible" />