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); |