Commit d028688a88068e2e4b8f128b6e21906475fd3edc

Authored by shixianjie
1 parent 90224e26a4
Exists in master

框选功能优化

libs/common/src/main/java/com/prws/common/widget/MarkSizeView.java
1 package com.prws.common.widget; 1 package com.prws.common.widget;
2 2
3 import android.content.Context; 3 import android.content.Context;
4 import android.content.res.TypedArray; 4 import android.content.res.TypedArray;
5 import android.graphics.Bitmap; 5 import android.graphics.Bitmap;
6 import android.graphics.BitmapFactory; 6 import android.graphics.BitmapFactory;
7 import android.graphics.Canvas; 7 import android.graphics.Canvas;
8 import android.graphics.Color; 8 import android.graphics.Color;
9 import android.graphics.Paint; 9 import android.graphics.Paint;
10 import android.graphics.Rect; 10 import android.graphics.Rect;
11 import android.graphics.RectF; 11 import android.graphics.RectF;
12 import android.util.AttributeSet; 12 import android.util.AttributeSet;
13 import android.util.Log; 13 import android.util.Log;
14 import android.view.MotionEvent; 14 import android.view.MotionEvent;
15 import android.view.View; 15 import android.view.View;
16 16
17 import com.prws.common.R; 17 import com.prws.common.R;
18 import com.prws.common.utils.CommonUtil; 18 import com.prws.common.utils.CommonUtil;
19 19
20 20
21 /** 21 /**
22 * Created by Administrator on 2016/11/28. 22 * Created by Administrator on 2016/11/28.
23 */ 23 */
24 public class MarkSizeView extends View { 24 public class MarkSizeView extends View {
25 private final String Tag = "MarkSizeView"; 25 private final String Tag = "MarkSizeView";
26 private static final int DEFAULT_MARKED_COLOR = Color.parseColor("#ffd84e43"); 26 private static final int DEFAULT_MARKED_COLOR = Color.parseColor("#ffd84e43");
27 private static final int DEFAULT_UNMARKED_COLOR = Color.parseColor("#00000000"); 27 private static final int DEFAULT_UNMARKED_COLOR = Color.parseColor("#00000000");
28 private static final int DEFAULT_STROKE_COLOR = Color.parseColor("#009688"); 28 private static final int DEFAULT_STROKE_COLOR = Color.parseColor("#009688");
29 private static final int DEFAULT_STROKE_WIDTH = 2;//dp 29 private static final int DEFAULT_STROKE_WIDTH = 2;//dp
30 private static final int DEFAULT_VERTEX_COLOR = Color.parseColor("#009688"); 30 private static final int DEFAULT_VERTEX_COLOR = Color.parseColor("#009688");
31 private static final int DEFAULT_CONFIRM_BUTTON_RES = R.mipmap.select_confirm; 31 private static final int DEFAULT_CONFIRM_BUTTON_RES = R.mipmap.select_confirm;
32 private static final int DEFAULT_CANCEL_BUTTON_RES = R.mipmap.select_cancel; 32 private static final int DEFAULT_CANCEL_BUTTON_RES = R.mipmap.select_cancel;
33 private static final int DEFAULT_BACK_ROUND_RES = R.color.white; 33 private static final int DEFAULT_BACK_ROUND_RES = R.color.white;
34 34
35 private static final int BUTTON_EXTRA_WIDTH = 8; 35 private static final int BUTTON_EXTRA_WIDTH = 8;
36 36
37 private static final int DEFAULT_VERTEX_WIDTH = 20;//dp 37 private static final int DEFAULT_VERTEX_WIDTH = 20;//dp
38 38
39 39
40 private int markedColor = DEFAULT_MARKED_COLOR; 40 private int markedColor = DEFAULT_MARKED_COLOR;
41 private int unmarkedColor = DEFAULT_UNMARKED_COLOR; 41 private int unmarkedColor = DEFAULT_UNMARKED_COLOR;
42 private int strokeColor = DEFAULT_STROKE_COLOR; 42 private int strokeColor = DEFAULT_STROKE_COLOR;
43 private int strokeWidth = DEFAULT_STROKE_WIDTH;//dp 43 private int strokeWidth = DEFAULT_STROKE_WIDTH;//dp
44 private int vertexColor = DEFAULT_VERTEX_COLOR; 44 private int vertexColor = DEFAULT_VERTEX_COLOR;
45 private int confirmButtonRes = DEFAULT_CONFIRM_BUTTON_RES; 45 private int confirmButtonRes = DEFAULT_CONFIRM_BUTTON_RES;
46 private int cancelButtonRes = DEFAULT_CANCEL_BUTTON_RES; 46 private int cancelButtonRes = DEFAULT_CANCEL_BUTTON_RES;
47 private int backGroundRes = DEFAULT_BACK_ROUND_RES; 47 private int backGroundRes = DEFAULT_BACK_ROUND_RES;
48 private int vertexWidth = DEFAULT_VERTEX_WIDTH; 48 private int vertexWidth = DEFAULT_VERTEX_WIDTH;
49 private int mActionGap; 49 private int mActionGap;
50 50
51 51
52 private Paint unMarkPaint, markPaint, vertexPaint, mBitPaint; 52 private Paint unMarkPaint, markPaint, vertexPaint, mBitPaint;
53 53
54 private int downX, downY; 54 private int downX, downY;
55 private int startX, startY; 55 private int startX, startY;
56 private int endX, endY; 56 private int endX, endY;
57 57
58 private Rect markedArea; 58 private Rect markedArea;
59 private Rect confirmArea, cancelArea; 59 private Rect confirmArea, cancelArea;
60 private RectF ltVer, rtVer, lbVer, rbVer; 60 private RectF ltVer, rtVer, lbVer, rbVer;
61 private boolean isValid = false; 61 private boolean isValid = false;
62 private boolean isUp = false; 62 private boolean isUp = false;
63 private boolean isMoveMode = false; 63 private boolean isMoveMode = false;
64 private boolean isAdjustMode = false; 64 private boolean isAdjustMode = false;
65 private boolean isButtonClicked = false; 65 private boolean isButtonClicked = false;
66 private int adjustNum = 0; 66 private int adjustNum = 0;
67 67
68 private Bitmap confirmBitmap, cancelBitmap, backGroundBitmap; 68 private Bitmap confirmBitmap, cancelBitmap, backGroundBitmap;
69 69
70 private onClickListener mOnClickListener; 70 private onClickListener mOnClickListener;
71 71
72 private Context context; 72 private Context context;
73 private Rect region; 73 private Rect region;
74 74
75 public MarkSizeView(Context context) { 75 public MarkSizeView(Context context) {
76 super(context); 76 super(context);
77 init(context, null); 77 init(context, null);
78 } 78 }
79 79
80 public MarkSizeView(Context context, AttributeSet attrs) { 80 public MarkSizeView(Context context, AttributeSet attrs) {
81 super(context, attrs); 81 super(context, attrs);
82 init(context, attrs); 82 init(context, attrs);
83 } 83 }
84 84
85 private void init(Context context, AttributeSet attrs) { 85 private void init(Context context, AttributeSet attrs) {
86 this.context = context; 86 this.context = context;
87 if (attrs != null) { 87 if (attrs != null) {
88 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MarkSizeView); 88 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MarkSizeView);
89 markedColor = typedArray.getColor(R.styleable.MarkSizeView_markedColor, DEFAULT_MARKED_COLOR); 89 markedColor = typedArray.getColor(R.styleable.MarkSizeView_markedColor, DEFAULT_MARKED_COLOR);
90 unmarkedColor = typedArray.getColor(R.styleable.MarkSizeView_unMarkedColor, DEFAULT_UNMARKED_COLOR); 90 unmarkedColor = typedArray.getColor(R.styleable.MarkSizeView_unMarkedColor, DEFAULT_UNMARKED_COLOR);
91 strokeColor = typedArray.getColor(R.styleable.MarkSizeView_strokesColor, DEFAULT_STROKE_COLOR); 91 strokeColor = typedArray.getColor(R.styleable.MarkSizeView_strokesColor, DEFAULT_STROKE_COLOR);
92 strokeWidth = typedArray.getDimensionPixelSize(R.styleable.MarkSizeView_strokeWidth, DEFAULT_STROKE_WIDTH); 92 strokeWidth = typedArray.getDimensionPixelSize(R.styleable.MarkSizeView_strokeWidth, DEFAULT_STROKE_WIDTH);
93 vertexColor = typedArray.getColor(R.styleable.MarkSizeView_vertexColor, DEFAULT_VERTEX_COLOR); 93 vertexColor = typedArray.getColor(R.styleable.MarkSizeView_vertexColor, DEFAULT_VERTEX_COLOR);
94 vertexWidth = typedArray.getDimensionPixelSize(R.styleable.MarkSizeView_vertexWidth, DEFAULT_VERTEX_WIDTH); 94 vertexWidth = typedArray.getDimensionPixelSize(R.styleable.MarkSizeView_vertexWidth, DEFAULT_VERTEX_WIDTH);
95 confirmButtonRes = typedArray.getResourceId(R.styleable.MarkSizeView_confirmButtonRes, DEFAULT_CONFIRM_BUTTON_RES); 95 confirmButtonRes = typedArray.getResourceId(R.styleable.MarkSizeView_confirmButtonRes, DEFAULT_CONFIRM_BUTTON_RES);
96 cancelButtonRes = typedArray.getResourceId(R.styleable.MarkSizeView_cancleButtonRes, DEFAULT_CANCEL_BUTTON_RES); 96 cancelButtonRes = typedArray.getResourceId(R.styleable.MarkSizeView_cancleButtonRes, DEFAULT_CANCEL_BUTTON_RES);
97 backGroundRes = typedArray.getResourceId(R.styleable.MarkSizeView_backGroundRes, DEFAULT_BACK_ROUND_RES); 97 backGroundRes = typedArray.getResourceId(R.styleable.MarkSizeView_backGroundRes, DEFAULT_BACK_ROUND_RES);
98 } 98 }
99 99
100 unMarkPaint = new Paint(); 100 unMarkPaint = new Paint();
101 unMarkPaint.setColor(unmarkedColor); 101 unMarkPaint.setColor(unmarkedColor);
102 unMarkPaint.setAntiAlias(true); 102 unMarkPaint.setAntiAlias(true);
103 103
104 markPaint = new Paint(); 104 markPaint = new Paint();
105 markPaint.setAntiAlias(true); 105 markPaint.setAntiAlias(true);
106 markPaint.setStrokeWidth(strokeWidth); //线的宽度 106 markPaint.setStrokeWidth(strokeWidth); //线的宽度
107 107
108 vertexPaint = new Paint(); 108 vertexPaint = new Paint();
109 vertexPaint.setColor(vertexColor); 109 vertexPaint.setColor(vertexColor);
110 vertexPaint.setAntiAlias(true); 110 vertexPaint.setAntiAlias(true);
111 111
112 mBitPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 112 mBitPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
113 mBitPaint.setFilterBitmap(true); 113 mBitPaint.setFilterBitmap(true);
114 mBitPaint.setDither(true); 114 mBitPaint.setDither(true);
115 115
116 markedArea = new Rect(); 116 markedArea = new Rect();
117 confirmArea = new Rect(); 117 confirmArea = new Rect();
118 cancelArea = new Rect(); 118 cancelArea = new Rect();
119 119
120 ltVer = new RectF(); 120 ltVer = new RectF();
121 rtVer = new RectF(); 121 rtVer = new RectF();
122 lbVer = new RectF(); 122 lbVer = new RectF();
123 rbVer = new RectF(); 123 rbVer = new RectF();
124 124
125 confirmBitmap = BitmapFactory.decodeResource(getResources(), confirmButtonRes); 125 confirmBitmap = BitmapFactory.decodeResource(getResources(), confirmButtonRes);
126 cancelBitmap = BitmapFactory.decodeResource(getResources(), cancelButtonRes); 126 cancelBitmap = BitmapFactory.decodeResource(getResources(), cancelButtonRes);
127 backGroundBitmap = BitmapFactory.decodeResource(getResources(), backGroundRes); 127 backGroundBitmap = BitmapFactory.decodeResource(getResources(), backGroundRes);
128 128
129 mActionGap = CommonUtil.dpToPx(context, 15); 129 mActionGap = CommonUtil.dpToPx(context, 15);
130 } 130 }
131 131
132 private int imageWidth; 132 private int imageWidth;
133 private int imageHeight; 133 private int imageHeight;
134 134
135 public void setSize(int imageWidth, int imageHeight) { 135 public void setSize(int imageWidth, int imageHeight) {
136 this.imageWidth = imageWidth; 136 this.imageWidth = imageWidth;
137 this.imageHeight = imageHeight; 137 this.imageHeight = imageHeight;
138 } 138 }
139 139
140 @Override 140 @Override
141 protected void onDraw(Canvas canvas) { 141 protected void onDraw(Canvas canvas) {
142 Log.d(toString(), "onDraw"); 142 Log.d(toString(), "onDraw");
143 143
144 int width = imageWidth > 0 ? imageWidth : getWidth(); 144 int width = imageWidth > 0 ? imageWidth : getWidth();
145 int height = imageHeight > 0 ? imageHeight : getHeight(); 145 int height = imageHeight > 0 ? imageHeight : getHeight();
146 //draw unmarked 146 //draw unmarked
147 Rect rect = new Rect(0, 0, width, height); 147 Rect rect = new Rect(0, 0, width, height);
148 if (backGroundBitmap != null) 148 if (backGroundBitmap != null)
149 canvas.drawBitmap(backGroundBitmap, null, rect, mBitPaint); 149 canvas.drawBitmap(backGroundBitmap, null, rect, mBitPaint);
150 canvas.drawRect(rect, unMarkPaint); 150 canvas.drawRect(rect, unMarkPaint);
151 //draw marked 151 //draw marked
152 if (isValid || !isEnabled()) { 152 if (isValid || !isEnabled()) {
153 markPaint.setStyle(Paint.Style.FILL); 153 markPaint.setStyle(Paint.Style.FILL);
154 markPaint.setColor(markedColor); 154 markPaint.setColor(markedColor);
155 155
156 canvas.drawRect(markedArea, markPaint); 156 canvas.drawRect(markedArea, markPaint);
157 157
158 markPaint.setStyle(Paint.Style.STROKE);//不填充 158 markPaint.setStyle(Paint.Style.STROKE);//不填充
159 markPaint.setColor(strokeColor); 159 markPaint.setColor(strokeColor);
160 canvas.drawRect(markedArea, markPaint); 160 canvas.drawRect(markedArea, markPaint);
161 setTranslationZ(8);
161 } 162 }
162 if (!isEnabled()) { 163 if (!isEnabled()) {
163 return; 164 return;
164 } 165 }
165 //draw vertex 166 //draw vertex
166 if (isValid && isUp) { 167 if (isValid && isUp) {
167 canvas.drawOval(ltVer, vertexPaint); 168 canvas.drawOval(ltVer, vertexPaint);
168 canvas.drawOval(rtVer, vertexPaint); 169 canvas.drawOval(rtVer, vertexPaint);
169 canvas.drawOval(lbVer, vertexPaint); 170 canvas.drawOval(lbVer, vertexPaint);
170 canvas.drawOval(rbVer, vertexPaint); 171 canvas.drawOval(rbVer, vertexPaint);
171 } 172 }
172 173
173 //draw button 174 //draw button
174 if (isValid && isUp) { 175 if (isValid && isUp) {
175 if (markedArea.width() >= CommonUtil.dpToPx(context, 30) && markedArea.height() >= CommonUtil.dpToPx(context, 30)) { 176 canvas.drawBitmap(confirmBitmap, null, confirmArea, mBitPaint);
176 canvas.drawBitmap(confirmBitmap, null, confirmArea, mBitPaint); 177 canvas.drawBitmap(cancelBitmap, null, cancelArea, mBitPaint);
177 canvas.drawBitmap(cancelBitmap, null, cancelArea, mBitPaint);
178 }
179 } 178 }
180 super.onDraw(canvas); 179 super.onDraw(canvas);
181 } 180 }
182 181
183 @Override 182 @Override
184 protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 183 protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
185 super.onLayout(changed, left, top, right, bottom); 184 super.onLayout(changed, left, top, right, bottom);
186 int measuredWidth = getMeasuredWidth(); 185 int measuredWidth = getMeasuredWidth();
187 int measuredHeight = getMeasuredHeight(); 186 int measuredHeight = getMeasuredHeight();
188 region = new Rect(0, 0, measuredWidth, measuredHeight); 187 region = new Rect(0, 0, measuredWidth, measuredHeight);
189 Log.e("onLayout", "measuredWidth=" + measuredWidth + ";measuredHeight=" + measuredHeight); 188 Log.e("onLayout", "measuredWidth=" + measuredWidth + ";measuredHeight=" + measuredHeight);
190 } 189 }
191 190
192 @Override 191 @Override
193 public boolean onTouchEvent(MotionEvent event) { 192 public boolean onTouchEvent(MotionEvent event) {
194 if (!isEnabled()) { 193 if (!isEnabled()) {
195 return false; 194 return false;
196 } 195 }
197 int x = (int) event.getX(); 196 int x = (int) event.getX();
198 int y = (int) event.getY(); 197 int y = (int) event.getY();
199 switch (event.getAction()) { 198 switch (event.getAction()) {
200 case MotionEvent.ACTION_DOWN: 199 case MotionEvent.ACTION_DOWN:
201 isUp = false; 200 isUp = false;
202 isAdjustMode = false; 201 isAdjustMode = false;
203 isMoveMode = false; 202 isMoveMode = false;
204 isButtonClicked = false; 203 isButtonClicked = false;
205 isValid = false; 204 isValid = false;
206 adjustNum = 0; 205 adjustNum = 0;
207 downX = x; 206 downX = x;
208 downY = y; 207 downY = y;
209 if (mOnClickListener != null) { 208 if (mOnClickListener != null) {
210 mOnClickListener.onTouch(); 209 mOnClickListener.onTouch();
211 } 210 }
212 if (isAreaContainPoint(confirmArea, x, y)) { 211 if (isAreaContainPoint(confirmArea, x, y)) {
213 isButtonClicked = true; 212 isButtonClicked = true;
214 isValid = true; 213 isValid = true;
215 invalidate(); 214 invalidate();
216 if (mOnClickListener != null) { 215 if (mOnClickListener != null) {
217 mOnClickListener.onConfirm(markedArea); 216 mOnClickListener.onConfirm(markedArea);
218 } 217 }
218 setTranslationZ(0);
219 } else if (isAreaContainPoint(cancelArea, x, y)) { 219 } else if (isAreaContainPoint(cancelArea, x, y)) {
220 isButtonClicked = true; 220 isButtonClicked = true;
221 isValid = true; 221 isValid = true;
222 if (mOnClickListener != null) { 222 if (mOnClickListener != null) {
223 mOnClickListener.onCancel(); 223 mOnClickListener.onCancel();
224 isValid = false; 224 isValid = false;
225 startX = startY = endX = endY = 0; 225 startX = startY = endX = endY = 0;
226 adjustMark(0, 0); 226 adjustMark(0, 0);
227 } 227 }
228 setTranslationZ(0);
228 } else if (isAreaContainPoint(ltVer, x, y)) { 229 } else if (isAreaContainPoint(ltVer, x, y)) {
229 isAdjustMode = true; 230 isAdjustMode = true;
230 adjustNum = 1; 231 adjustNum = 1;
231 } else if (isAreaContainPoint(rtVer, x, y)) { 232 } else if (isAreaContainPoint(rtVer, x, y)) {
232 isAdjustMode = true; 233 isAdjustMode = true;
233 adjustNum = 2; 234 adjustNum = 2;
234 } else if (isAreaContainPoint(lbVer, x, y)) { 235 } else if (isAreaContainPoint(lbVer, x, y)) {
235 isAdjustMode = true; 236 isAdjustMode = true;
236 adjustNum = 3; 237 adjustNum = 3;
237 } else if (isAreaContainPoint(rbVer, x, y)) { 238 } else if (isAreaContainPoint(rbVer, x, y)) {
238 isAdjustMode = true; 239 isAdjustMode = true;
239 adjustNum = 4; 240 adjustNum = 4;
240 } else if (markedArea.contains(x, y)) { 241 } else if (markedArea.contains(x, y)) {
241 isMoveMode = true; 242 isMoveMode = true;
242 } else { 243 } else {
243 isMoveMode = false; 244 isMoveMode = false;
244 startX = (int) event.getX(); 245 startX = (int) event.getX();
245 startY = (int) event.getY(); 246 startY = (int) event.getY();
246 endX = startX; 247 endX = startX;
247 endY = startY; 248 endY = startY;
248 } 249 }
249 break; 250 break;
250 case MotionEvent.ACTION_MOVE: 251 case MotionEvent.ACTION_MOVE:
251 if (isButtonClicked) { 252 if (isButtonClicked) {
252 break; 253 break;
253 } 254 }
254 adjustMark(x, y); 255 adjustMark(x, y);
255 break; 256 break;
256 case MotionEvent.ACTION_UP: 257 case MotionEvent.ACTION_UP:
257 isUp = true; 258 isUp = true;
258 if (markedArea.width() >= CommonUtil.dpToPx(context, 30) && markedArea.height() >= CommonUtil.dpToPx(context, 30)) { 259 if (isButtonClicked) {
259 if (isButtonClicked) { 260 break;
260 break; 261 }
261 } 262 adjustMark(x, y);
262 adjustMark(x, y); 263 startX = markedArea.left;
263 startX = markedArea.left; 264 startY = markedArea.top;
264 startY = markedArea.top; 265 endX = markedArea.right;
265 endX = markedArea.right; 266 endY = markedArea.bottom;
266 endY = markedArea.bottom; 267
267 268 if (markedArea.width() > confirmBitmap.getWidth() * 3 + mActionGap * 3 && markedArea.height() > confirmBitmap.getHeight() * 5) {
268 if (markedArea.width() > confirmBitmap.getWidth() * 3 + mActionGap * 3 && markedArea.height() > confirmBitmap.getHeight() * 5) { 269 //显示在选区的内底部
269 //显示在选区的内底部 270 confirmArea.set(endX - confirmBitmap.getWidth() - mActionGap,
270 confirmArea.set(endX - confirmBitmap.getWidth() - mActionGap, 271 endY - confirmBitmap.getHeight() - mActionGap,
271 endY - confirmBitmap.getHeight() - mActionGap, 272 endX - mActionGap,
272 endX - mActionGap, 273 endY - mActionGap);
273 endY - mActionGap); 274
274 275 cancelArea.set(endX - 2 * confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
275 cancelArea.set(endX - 2 * confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15), 276 endY - confirmBitmap.getHeight() - mActionGap,
276 endY - confirmBitmap.getHeight() - mActionGap, 277 endX - confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
277 endX - confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15), 278 endY - mActionGap);
278 endY - mActionGap); 279 } else if (endY > getHeight() - confirmBitmap.getHeight() * 3) {
279 } else if (endY > getHeight() - confirmBitmap.getHeight() * 3) { 280 //显示在选区的上面
280 //显示在选区的上面 281 confirmArea.set(endX - confirmBitmap.getWidth() - mActionGap,
281 confirmArea.set(endX - confirmBitmap.getWidth() - mActionGap, 282 startY - confirmBitmap.getHeight() - mActionGap,
282 startY - confirmBitmap.getHeight() - mActionGap, 283 endX - mActionGap,
283 endX - mActionGap, 284 startY - mActionGap);
284 startY - mActionGap); 285
285 286 cancelArea.set(endX - 2 * confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
286 cancelArea.set(endX - 2 * confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15), 287 startY - confirmBitmap.getHeight() - mActionGap,
287 startY - confirmBitmap.getHeight() - mActionGap, 288 endX - confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
288 endX - confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15), 289 startY - mActionGap);
289 startY - mActionGap); 290 } else {
290 } else { 291 //显示在选区的下面
291 //显示在选区的下面 292 confirmArea.set(endX - confirmBitmap.getWidth() - mActionGap,
292 confirmArea.set(endX - confirmBitmap.getWidth() - mActionGap, 293 endY + mActionGap,
293 endY + mActionGap, 294 endX - mActionGap,
294 endX - mActionGap, 295 endY + confirmBitmap.getHeight() + mActionGap);
295 endY + confirmBitmap.getHeight() + mActionGap); 296
296 297 cancelArea.set(endX - 2 * confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
297 cancelArea.set(endX - 2 * confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15), 298 endY + mActionGap,
298 endY + mActionGap, 299 endX - confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
299 endX - confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15), 300 endY + confirmBitmap.getHeight() + mActionGap);
300 endY + confirmBitmap.getHeight() + mActionGap); 301 }
301 }
302 302
303 if (cancelArea.left < 0) { 303 if (cancelArea.left < 0) {
304 int cancelAreaLeftMargin = Math.abs(cancelArea.left) + mActionGap; 304 int cancelAreaLeftMargin = Math.abs(cancelArea.left) + mActionGap;
305 cancelArea.left = cancelArea.left + cancelAreaLeftMargin; 305 cancelArea.left = cancelArea.left + cancelAreaLeftMargin;
306 cancelArea.right = cancelArea.right + cancelAreaLeftMargin; 306 cancelArea.right = cancelArea.right + cancelAreaLeftMargin;
307 confirmArea.left = confirmArea.left + cancelAreaLeftMargin; 307 confirmArea.left = confirmArea.left + cancelAreaLeftMargin;
308 confirmArea.right = confirmArea.right + cancelAreaLeftMargin; 308 confirmArea.right = confirmArea.right + cancelAreaLeftMargin;
309 } 309 }
310 310
311 if (!isValid) { 311 if (!isValid) {
312 if (mOnClickListener != null) { 312 if (mOnClickListener != null) {
313 mOnClickListener.onCancel(); 313 mOnClickListener.onCancel();
314 }
315 } 314 }
315 setTranslationZ(0);
316 } 316 }
317 break; 317 break;
318 case MotionEvent.ACTION_CANCEL: 318 case MotionEvent.ACTION_CANCEL:
319 isUp = true; 319 isUp = true;
320 break; 320 break;
321 } 321 }
322 postInvalidate(); 322 postInvalidate();
323 return true; 323 return true;
324 } 324 }
325 325
326 /** 326 /**
327 * 是否在按钮点击范围 327 * 是否在按钮点击范围
328 * 328 *
329 * @param area 329 * @param area
330 * @param x 330 * @param x
331 * @param y 331 * @param y
332 * @return 332 * @return
333 */ 333 */
334 private boolean isAreaContainPoint(Rect area, int x, int y) { 334 private boolean isAreaContainPoint(Rect area, int x, int y) {
335 Rect newArea = new Rect(area.left - BUTTON_EXTRA_WIDTH, area.top - BUTTON_EXTRA_WIDTH, area.right + BUTTON_EXTRA_WIDTH, area.bottom + BUTTON_EXTRA_WIDTH); 335 Rect newArea = new Rect(area.left - BUTTON_EXTRA_WIDTH, area.top - BUTTON_EXTRA_WIDTH, area.right + BUTTON_EXTRA_WIDTH, area.bottom + BUTTON_EXTRA_WIDTH);
336 if (newArea.contains(x, y)) { 336 if (newArea.contains(x, y)) {
337 return true; 337 return true;
338 } 338 }
339 return false; 339 return false;
340 } 340 }
341 341
342 private void adjustMark(int x, int y) { 342 private void adjustMark(int x, int y) {
343 if (isAdjustMode) { 343 if (isAdjustMode) {
344 //拖动四个顶点 344 //拖动四个顶点
345 int moveMentX = x - downX; 345 int moveMentX = x - downX;
346 int moveMentY = y - downY; 346 int moveMentY = y - downY;
347 347
348 switch (adjustNum) { 348 switch (adjustNum) {
349 case 1: 349 case 1:
350 startX = startX + moveMentX; 350 startX = startX + moveMentX;
351 startY = startY + moveMentY; 351 startY = startY + moveMentY;
352 break; 352 break;
353 case 2: 353 case 2:
354 endX = endX + moveMentX; 354 endX = endX + moveMentX;
355 startY = startY + moveMentY; 355 startY = startY + moveMentY;
356 break; 356 break;
357 case 3: 357 case 3:
358 startX = startX + moveMentX; 358 startX = startX + moveMentX;
359 endY = endY + moveMentY; 359 endY = endY + moveMentY;
360 break; 360 break;
361 case 4: 361 case 4:
362 endX = endX + moveMentX; 362 endX = endX + moveMentX;
363 endY = endY + moveMentY; 363 endY = endY + moveMentY;
364 break; 364 break;
365 } 365 }
366 downX = x; 366 downX = x;
367 downY = y; 367 downY = y;
368 } else if (isMoveMode) { 368 } else if (isMoveMode) {
369 //移动矩形框 369 //移动矩形框
370 int moveMentX = x - downX; 370 int moveMentX = x - downX;
371 int moveMentY = y - downY; 371 int moveMentY = y - downY;
372 372
373 startX = startX + moveMentX; 373 startX = startX + moveMentX;
374 startY = startY + moveMentY; 374 startY = startY + moveMentY;
375 375
376 endX = endX + moveMentX; 376 endX = endX + moveMentX;
377 endY = endY + moveMentY; 377 endY = endY + moveMentY;
378 378
379 downX = x; 379 downX = x;
380 downY = y; 380 downY = y;
381 } else { 381 } else {
382 //绘制矩形框 382 //绘制矩形框
383 endX = x; 383 endX = x;
384 endY = y; 384 endY = y;
385 } 385 }
386 Log.e(Tag, "startX=" + startX + ";startY=" + startY + ";endX=" + endX + ";endY=" + endY); 386 Log.e(Tag, "startX=" + startX + ";startY=" + startY + ";endX=" + endX + ";endY=" + endY);
387 Rect rect = new Rect(Math.min(startX, endX), Math.min(startY, endY), Math.max(startX, endX), Math.max(startY, endY)); 387 Rect rect = new Rect(Math.min(startX, endX), Math.min(startY, endY), Math.max(startX, endX), Math.max(startY, endY));
388 if (region.contains(rect)) { 388 if (region.contains(rect)) {
389 //当方框的区域不超出View的宽高值时才绘制 389 //当方框的区域不超出View的宽高值时才绘制
390 markedArea.set(Math.min(startX, endX), Math.min(startY, endY), Math.max(startX, endX), Math.max(startY, endY)); 390 markedArea.set(Math.min(startX, endX), Math.min(startY, endY), Math.max(startX, endX), Math.max(startY, endY));
391 } 391 }
392 ltVer.set(markedArea.left - vertexWidth / 2, markedArea.top - vertexWidth / 2, markedArea.left + vertexWidth / 2, markedArea.top + vertexWidth / 2); 392 ltVer.set(markedArea.left - vertexWidth / 2, markedArea.top - vertexWidth / 2, markedArea.left + vertexWidth / 2, markedArea.top + vertexWidth / 2);
393 rtVer.set(markedArea.right - vertexWidth / 2, markedArea.top - vertexWidth / 2, markedArea.right + vertexWidth / 2, markedArea.top + vertexWidth / 2); 393 rtVer.set(markedArea.right - vertexWidth / 2, markedArea.top - vertexWidth / 2, markedArea.right + vertexWidth / 2, markedArea.top + vertexWidth / 2);
394 lbVer.set(markedArea.left - vertexWidth / 2, markedArea.bottom - vertexWidth / 2, markedArea.left + vertexWidth / 2, markedArea.bottom + vertexWidth / 2); 394 lbVer.set(markedArea.left - vertexWidth / 2, markedArea.bottom - vertexWidth / 2, markedArea.left + vertexWidth / 2, markedArea.bottom + vertexWidth / 2);
395 rbVer.set(markedArea.right - vertexWidth / 2, markedArea.bottom - vertexWidth / 2, markedArea.right + vertexWidth / 2, markedArea.bottom + vertexWidth / 2); 395 rbVer.set(markedArea.right - vertexWidth / 2, markedArea.bottom - vertexWidth / 2, markedArea.right + vertexWidth / 2, markedArea.bottom + vertexWidth / 2);
396 if (markedArea.height() * markedArea.width() > 200) { 396 if (markedArea.height() * markedArea.width() > 200) {
397 isValid = true; 397 isValid = true;
398 } else { 398 } else {
399 isValid = false; 399 isValid = false;
400 } 400 }
401 } 401 }
402 402
403 private boolean isAreaContainPoint(RectF area, int x, int y) { 403 private boolean isAreaContainPoint(RectF area, int x, int y) {
404 RectF newArea = new RectF(area.left - BUTTON_EXTRA_WIDTH, area.top - BUTTON_EXTRA_WIDTH, area.right + BUTTON_EXTRA_WIDTH, area.bottom + BUTTON_EXTRA_WIDTH); 404 RectF newArea = new RectF(area.left - BUTTON_EXTRA_WIDTH, area.top - BUTTON_EXTRA_WIDTH, area.right + BUTTON_EXTRA_WIDTH, area.bottom + BUTTON_EXTRA_WIDTH);
405 if (newArea.contains(x, y)) { 405 if (newArea.contains(x, y)) {
406 return true; 406 return true;
407 } 407 }
408 return false; 408 return false;
409 } 409 }
410 410
411 public interface onClickListener { 411 public interface onClickListener {
412 void onConfirm(Rect markedArea); 412 void onConfirm(Rect markedArea);
413 413
414 void onCancel(); 414 void onCancel();
415 415
416 void onTouch(); 416 void onTouch();
417 } 417 }
418 418
419 public void setmOnClickListener(onClickListener mOnClickListener) { 419 public void setmOnClickListener(onClickListener mOnClickListener) {
420 this.mOnClickListener = mOnClickListener; 420 this.mOnClickListener = mOnClickListener;
421 } 421 }
422 422
423 public void setBackGroundRes(int backGroundRes) { 423 public void setBackGroundRes(int backGroundRes) {
424 Bitmap backGroundBitmap = BitmapFactory.decodeResource(getResources(), backGroundRes); 424 Bitmap backGroundBitmap = BitmapFactory.decodeResource(getResources(), backGroundRes);
425 this.backGroundBitmap = backGroundBitmap; 425 this.backGroundBitmap = backGroundBitmap;
426 postInvalidate(); 426 postInvalidate();
427 } 427 }
428 428
429 public void setBackGroundBitmap(Bitmap backGroundBitmap) { 429 public void setBackGroundBitmap(Bitmap backGroundBitmap) {
430 this.backGroundBitmap = backGroundBitmap; 430 this.backGroundBitmap = backGroundBitmap;
431 postInvalidate(); 431 postInvalidate();
432 } 432 }
433 433
434 public Bitmap getBackGroundBitmap() { 434 public Bitmap getBackGroundBitmap() {
435 return backGroundBitmap; 435 return backGroundBitmap;
436 } 436 }
437 437
438 public void setUnmarkedColor(int unmarkedColor) { 438 public void setUnmarkedColor(int unmarkedColor) {
439 this.unmarkedColor = unmarkedColor; 439 this.unmarkedColor = unmarkedColor;
440 unMarkPaint.setColor(unmarkedColor); 440 unMarkPaint.setColor(unmarkedColor);
441 invalidate(); 441 invalidate();
442 } 442 }
443 443
444 public void reset() { 444 public void reset() {
445 isUp = false; 445 isUp = false;
446 isValid = false; 446 isValid = false;
447 startX = startY = endX = endY = 0; 447 startX = startY = endX = endY = 0;
448 adjustMark(0, 0); 448 adjustMark(0, 0);