Commit d028688a88068e2e4b8f128b6e21906475fd3edc
1 parent
90224e26a4
Exists in
master
框选功能优化
Showing
1 changed file
with
59 additions
and
59 deletions
Show diff stats
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); |