Skip to content

Commit cbbd2b5

Browse files
author
huangziwei
committed
完善Doodle框架:修改IDoodleItem、IDoodlePen、IDoodleShape,优化编辑模式
1 parent 99f6d05 commit cbbd2b5

23 files changed

+1037
-943
lines changed

app/src/main/java/cn/hzw/doodledemo/MosaicDemo.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,6 @@ private static class MosaicPen implements IDoodlePen {
8888
public void config(IDoodleItem doodleItem, Paint paint) {
8989
}
9090

91-
@Override
92-
public boolean isSelectable() {
93-
return false;
94-
}
95-
96-
@Override
97-
public void setSelectable(boolean isSelectable) {
98-
99-
}
100-
10191
@Override
10292
public void drawHelpers(Canvas canvas, IDoodle doodle) {
10393
}

doodle/src/main/java/cn/hzw/doodle/DoodleActivity.java

Lines changed: 337 additions & 370 deletions
Large diffs are not rendered by default.

doodle/src/main/java/cn/hzw/doodle/DoodleBitmap.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.graphics.Bitmap;
44
import android.graphics.Canvas;
5+
import android.graphics.Paint;
56
import android.graphics.Rect;
67

78
import cn.hzw.doodle.core.IDoodle;

doodle/src/main/java/cn/hzw/doodle/DoodleItemBase.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,6 @@ public void setDrawOptimize(boolean drawOptimize) {
189189
mIsDrawOptimize = drawOptimize;
190190
}
191191

192-
/**
193-
* 是否优化绘制,若是则在添加item时提前会绘制到图片上,若否则在每次view绘制时绘制在View中,直到保存时才绘制到图片上
194-
*/
195-
public boolean isDrawOptimize() {
196-
return mIsDrawOptimize;
197-
}
198-
199192
@Override
200193
public boolean isNeedClipOutside() {
201194
return mIsNeedClipOutside;
@@ -223,6 +216,11 @@ public void refresh() {
223216
}
224217
}
225218

219+
@Override
220+
public boolean isDoodleEditable() {
221+
return false;
222+
}
223+
226224
/**
227225
* 仅画在View上,在绘制涂鸦图片之前调用(相当于背景图,但是保存图片时不包含该部分)
228226
*
@@ -248,6 +246,10 @@ protected void drawAfter(Canvas canvas) {
248246

249247
}
250248

249+
/**
250+
* 画在所有item的上面
251+
* @param canvas
252+
*/
251253
protected void drawAtTheTop(Canvas canvas) {
252254

253255
}

doodle/src/main/java/cn/hzw/doodle/DoodleOnTouchGestureListener.java

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import cn.forward.androids.TouchGestureDetector;
1313
import cn.hzw.doodle.core.IDoodle;
1414
import cn.hzw.doodle.core.IDoodleItem;
15+
import cn.hzw.doodle.core.IDoodlePen;
1516
import cn.hzw.doodle.core.IDoodleSelectableItem;
1617

1718
import static cn.hzw.doodle.util.DrawUtil.computeAngle;
@@ -88,7 +89,6 @@ public IDoodleSelectableItem getSelectedItem() {
8889
public boolean onDown(MotionEvent e) {
8990
mTouchX = mTouchDownX = e.getX();
9091
mTouchY = mTouchDownY = e.getY();
91-
mDoodle.enableZoomer(false); // 关闭放大镜
9292
return true;
9393
}
9494

@@ -101,9 +101,9 @@ public boolean onDown(MotionEvent e) {
101101
public void onScrollBegin(MotionEvent event) {
102102
mLastTouchX = mTouchX = event.getX();
103103
mLastTouchY = mTouchY = event.getY();
104+
mDoodle.setScrollingDoodle(true);
104105

105-
if (mDoodle.getPen().isSelectable()) {
106-
// 判断是否点中选择区域
106+
if (mDoodle.isEditMode() || isPenEditable(mDoodle.getPen())) {
107107
if (mSelectedItem != null) {
108108
PointF xy = mSelectedItem.getLocation();
109109
mSelectedItemX = xy.x;
@@ -116,7 +116,6 @@ public void onScrollBegin(MotionEvent event) {
116116
}
117117
}
118118
} else {
119-
mDoodle.enableZoomer(true); // 涂鸦时开启放大镜
120119
// 点击copy
121120
if (mDoodle.getPen() == DoodlePen.COPY && mCopyLocation.contains(mDoodle.toX(mTouchX), mDoodle.toY(mTouchY), mDoodle.getSize())) {
122121
mCopyLocation.setRelocating(true);
@@ -139,7 +138,6 @@ public void onScrollBegin(MotionEvent event) {
139138
mCurrDoodlePath = DoodlePath.toShape(mDoodle,
140139
mDoodle.toX(mTouchDownX), mDoodle.toY(mTouchDownY), mDoodle.toX(mTouchX), mDoodle.toY(mTouchY));
141140
}
142-
// mCurrDoodlePath.setDrawOptimize(false);
143141
mDoodle.addItem(mCurrDoodlePath);
144142
}
145143
}
@@ -152,19 +150,17 @@ public void onScrollEnd(MotionEvent e) {
152150
mLastTouchY = mTouchY;
153151
mTouchX = e.getX();
154152
mTouchY = e.getY();
153+
mDoodle.setScrollingDoodle(false);
155154

156-
if (mDoodle.getPen().isSelectable()) {
155+
if (mDoodle.isEditMode() || isPenEditable(mDoodle.getPen())) {
157156
if (mSelectedItem instanceof DoodleRotatableItemBase) {
158157
((DoodleRotatableItemBase) mSelectedItem).setIsRotating(false);
159158
}
160159
} else {
161160
if (mCurrDoodlePath != null) {
162-
/*mCurrDoodlePath.setDrawOptimize(true);
163-
mDoodle.refresh(mCurrDoodlePath);*/
164161
mCurrDoodlePath = null;
165162
}
166163
}
167-
mDoodle.enableZoomer(false); // 关闭放大镜
168164
mDoodle.refresh();
169165
}
170166

@@ -175,7 +171,7 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d
175171
mTouchX = e2.getX();
176172
mTouchY = e2.getY();
177173

178-
if (mDoodle.getPen().isSelectable()) { //画笔是否是可选择的
174+
if (mDoodle.isEditMode() || isPenEditable(mDoodle.getPen())) { //画笔是否是可选择的
179175
if (mSelectedItem != null) {
180176
if ((mSelectedItem instanceof DoodleRotatableItemBase) && (((DoodleRotatableItemBase) mSelectedItem).isRotating())) { // 旋转item
181177
PointF xy = mSelectedItem.getLocation();
@@ -213,6 +209,11 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d
213209
return true;
214210
}
215211

212+
// 判断当前画笔是否可编辑,前提必须跟当前涂鸦框架选中的画笔相同,以此在非编辑模式下只有当前画笔类型的可编辑
213+
private boolean isPenEditable(IDoodlePen pen) {
214+
return (mDoodle.getPen() == DoodlePen.TEXT && pen == DoodlePen.TEXT)
215+
|| (mDoodle.getPen() == DoodlePen.BITMAP && pen == DoodlePen.BITMAP);
216+
}
216217

217218
@Override
218219
public boolean onSingleTapUp(MotionEvent e) {
@@ -221,24 +222,29 @@ public boolean onSingleTapUp(MotionEvent e) {
221222
mTouchX = e.getX();
222223
mTouchY = e.getY();
223224

224-
if (mDoodle.getPen().isSelectable()) {
225+
boolean penEditable = isPenEditable(mDoodle.getPen());
226+
227+
if (mDoodle.isEditMode() || penEditable) {
225228
boolean found = false;
226229
IDoodleSelectableItem item;
227230
List<IDoodleItem> items = mDoodle.getAllItem();
228231
for (int i = items.size() - 1; i >= 0; i--) {
229232
IDoodleItem elem = items.get(i);
230-
if (!(elem instanceof IDoodleSelectableItem)|| !elem.getPen().isSelectable()) {
233+
if (!(elem instanceof IDoodleSelectableItem) || !elem.isDoodleEditable()) {
231234
continue;
232235
}
233236
item = (IDoodleSelectableItem) elem;
234237

235-
if (item.contains(mDoodle.toX(mTouchX), mDoodle.toY(mTouchY))) {
236-
found = true;
237-
setSelectedItem(item);
238-
PointF xy = item.getLocation();
239-
mSelectedItemX = xy.x;
240-
mSelectedItemY = xy.y;
241-
break;
238+
if (mDoodle.isEditMode()
239+
|| penEditable && isPenEditable(item.getPen())) { // 非编辑模式下必须保证画笔是可编辑的类型
240+
if (item.contains(mDoodle.toX(mTouchX), mDoodle.toY(mTouchY))) {
241+
found = true;
242+
setSelectedItem(item);
243+
PointF xy = item.getLocation();
244+
mSelectedItemX = xy.x;
245+
mSelectedItemY = xy.y;
246+
break;
247+
}
242248
}
243249
}
244250
if (!found) {
@@ -249,7 +255,8 @@ public boolean onSingleTapUp(MotionEvent e) {
249255
mSelectionListener.onSelectedItem(mDoodle, old, false);
250256
}
251257
} else {
252-
if (mSelectionListener != null) {
258+
if (!mDoodle.isEditMode() // 编辑模式下不能添加item
259+
&& mSelectionListener != null) {
253260
mSelectionListener.onCreateSelectableItem(mDoodle, mDoodle.toX(mTouchX), mDoodle.toY(mTouchY));
254261
}
255262
}
@@ -269,7 +276,6 @@ public boolean onSingleTapUp(MotionEvent e) {
269276
public boolean onScaleBegin(ScaleGestureDetectorApi27 detector) {
270277
mLastFocusX = null;
271278
mLastFocusY = null;
272-
mDoodle.enableZoomer(false);
273279
return true;
274280
}
275281

doodle/src/main/java/cn/hzw/doodle/DoodlePath.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,19 @@ public static DoodlePath toPath(IDoodle doodle, Path p) {
121121
return path;
122122
}
123123

124+
@Override
125+
public void setSize(float size) {
126+
super.setSize(size);
127+
if (DoodleShape.ARROW.equals(getShape())) {
128+
if (mPath == null) {
129+
mPath = new Path();
130+
}
131+
mPath.reset();
132+
updateArrowPath(mPath, mSxy.x, mSxy.y, mDxy.x, mDxy.y, getSize());
133+
}
134+
refresh();
135+
}
136+
124137
@Override
125138
protected void doDraw(Canvas canvas) {
126139
mPaint.reset();
@@ -131,7 +144,9 @@ protected void doDraw(Canvas canvas) {
131144

132145
getPen().config(this, mPaint);
133146
getColor().config(this, mPaint);
134-
getShape().draw(canvas, this, mPaint);
147+
getShape().config(this, mPaint);
148+
149+
canvas.drawPath(getPath(), mPaint);
135150
}
136151

137152
private RectF mBound = new RectF();
@@ -148,6 +163,13 @@ protected void resetBounds(Rect rect) {
148163
}
149164
}
150165

166+
@Override
167+
public boolean isDoodleEditable() {
168+
if (getPen() == DoodlePen.ERASER) {
169+
return false;
170+
}
171+
return super.isDoodleEditable();
172+
}
151173

152174
//---------计算Path
153175
private Path mArrowTrianglePath;

doodle/src/main/java/cn/hzw/doodle/DoodlePen.java

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,12 @@ public enum DoodlePen implements IDoodlePen {
1616
BRUSH, // 画笔
1717
COPY, // 仿制
1818
ERASER, // 橡皮擦
19-
TEXT(true), // 文本
20-
BITMAP(true); // 贴图
19+
TEXT, // 文本
20+
BITMAP; // 贴图
2121

22-
private boolean mIsSelectable = false; // 画笔绘制的item是否可选
2322
private CopyLocation mCopyLocation;
2423
private Matrix mMatrix;
2524

26-
DoodlePen() {
27-
this(false);
28-
}
29-
30-
DoodlePen(boolean isSelectable) {
31-
mIsSelectable = isSelectable;
32-
}
33-
3425
@Override
3526
public void config(IDoodleItem item, Paint paint) {
3627
DoodleItemBase doodleItem = (DoodleItemBase) item;
@@ -52,23 +43,6 @@ public void config(IDoodleItem item, Paint paint) {
5243
}
5344
}
5445

55-
/**
56-
* 画笔制作的item是否可选,用于旋转、移动等特定操作
57-
*
58-
* @return
59-
*/
60-
public boolean isSelectable() {
61-
return mIsSelectable;
62-
}
63-
64-
@Override
65-
public void setSelectable(boolean selectable) {
66-
if (this == DoodlePen.ERASER) {
67-
throw new UnsupportedOperationException("DoodlePen.ERASER is unselectable");
68-
}
69-
mIsSelectable = selectable;
70-
}
71-
7246
public CopyLocation getCopyLocation() {
7347
if (this != COPY) {
7448
return null;
@@ -85,14 +59,16 @@ public CopyLocation getCopyLocation() {
8559
}
8660

8761
@Override
88-
public void drawHelpers(Canvas canvas, IDoodle doodle) {
89-
if (this == COPY) {
90-
mCopyLocation.drawItSelf(canvas, doodle.getSize());
91-
}
62+
public IDoodlePen copy() {
63+
return this;
9264
}
9365

9466
@Override
95-
public IDoodlePen copy() {
96-
return this;
67+
public void drawHelpers(Canvas canvas, IDoodle doodle) {
68+
if (this == COPY) {
69+
if (doodle instanceof DoodleView && !((DoodleView) doodle).isEditMode()) {
70+
mCopyLocation.drawItSelf(canvas, doodle.getSize());
71+
}
72+
}
9773
}
9874
}

doodle/src/main/java/cn/hzw/doodle/DoodleSelectableItemBase.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,8 @@ public void setSelected(boolean isSelected) {
134134

135135
protected abstract void resetBounds(Rect rect);
136136

137+
@Override
138+
public boolean isDoodleEditable() {
139+
return true;
140+
}
137141
}

doodle/src/main/java/cn/hzw/doodle/DoodleShape.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.graphics.Canvas;
44
import android.graphics.Paint;
55

6+
import cn.hzw.doodle.core.IDoodle;
67
import cn.hzw.doodle.core.IDoodleItem;
78
import cn.hzw.doodle.core.IDoodleShape;
89

@@ -20,16 +21,21 @@ public enum DoodleShape implements IDoodleShape {
2021

2122

2223
@Override
23-
public void draw(Canvas canvas, IDoodleItem doodleItem, Paint paint) {
24+
public void config(IDoodleItem doodleItem, Paint paint) {
2425
if (doodleItem.getShape() == DoodleShape.ARROW || doodleItem.getShape() == DoodleShape.FILL_CIRCLE || doodleItem.getShape() == DoodleShape.FILL_RECT) {
2526
paint.setStyle(Paint.Style.FILL);
27+
} else {
28+
paint.setStyle(Paint.Style.STROKE);
2629
}
27-
DoodlePath doodlePath = (DoodlePath) doodleItem;
28-
canvas.drawPath(doodlePath.getPath(), paint);
2930
}
3031

3132
@Override
3233
public IDoodleShape copy() {
3334
return this;
3435
}
36+
37+
@Override
38+
public void drawHelpers(Canvas canvas, IDoodle doodle) {
39+
40+
}
3541
}

0 commit comments

Comments
 (0)