矩形,圆,直线其实都是两个点来决定的,自由划线相对麻烦些,我们实际项目中还需要把这些点保存,在屏幕旋转时能够保持这些图形的准确位置,因为我们用在视频的讲解上,划线也是在视频画面上绘制.
在这里还添加了画笔颜色选择,双击撤销上一部操作的功能 , 还有角度的计算 显示 , 下面,慢慢欣赏代码吧
public class SingleDrawEditView extends RelativeLayout {
private static final String TAG = SingleDrawEditView.class.getSimpleName();
private static final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout();//双击间隔
private static final int MIN_LINE_LENGTH = 20;//直线最短长度
private static final int LINE_WIDTH = 2;//直线宽度 dp
private static final int MIN_TWO_LINE_SPACING = 50;//两条线之间最短距离
private static final int TEXT_SIZE = 18;//文字大小 单位dp
public static final int TYPE_RECT = 1;
public static final int TYPE_RING = 2;
public static final int TYPE_LINE = 3;
public static final int TYPE_CASUAL = 4;
private int mType;
private static Paint mShapePaint;
private Paint mAnglePaint;
public static int[] mColor;
private int mCurrentColorIndex = 0;
private float mDensity;
private LineTouchHelper mLineTouchHelper;
private RectTouchHelper mRectTouchHelper;
private RingTouchHelper mRingTouchHelper;
private CausalLineTouchHelper mCasualTouchHelper;
public List<Shape> mShapeList = new ArrayList<>();
public List<Shape> getmShapeList() {
return mShapeList;
}
public void setmShapeList(List<Shape> mShapeList) {
this.mShapeList = mShapeList;
}
private SimpleArrayMap<Integer, AngleBean> mAngleMap = new SimpleArrayMap<>();
private Shape mCurrentShape;
private int mAngleIdIndex;
private Context context;
public void setSelectedLeft(boolean selectedLeft) {
this.selectedLeft = selectedLeft;
}
private boolean selectedLeft = true;
public SingleDrawEditView(Context context) {
this(context, null);
}
public SingleDrawEditView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SingleDrawEditView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
mDensity = getResources().getDisplayMetrics().density;
init();
}
public void init() {
mColor = new int[4];
mColor[0] = getResources().getColor(R.color.video_play_draw_color_1);
mColor[1] = getResources().getColor(R.color.video_play_draw_color_2);
mColor[2] = getResources().getColor(R.color.video_play_draw_color_3);
mColor[3] = getResources().getColor(R.color.video_play_draw_color_4);
mShapePaint = new Paint();
mShapePaint.setAntiAlias(true);
mShapePaint.setStyle(Paint.Style.STROKE);
mShapePaint.setStrokeWidth(LINE_WIDTH * mDensity);
mAnglePaint = new Paint();
mAnglePaint.setAntiAlias(true);
mAnglePaint.setStyle(Paint.Style.FILL);
mAnglePaint.setTextSize(TEXT_SIZE * mDensity);
mLineTouchHelper = new LineTouchHelper();
mRectTouchHelper = new RectTouchHelper();
mRingTouchHelper = new RingTouchHelper();
mCasualTouchHelper = new CausalLineTouchHelper();
}
public void setLineWidth() {
mShapePaint.setStrokeWidth(LINE_WIDTH * mDensity * 2);
}
public void setTextSize() {
mAnglePaint.setTextSize(TEXT_SIZE * mDensity * 2);
}
public boolean setType(int type) {
if (mType == type) {
mType = 0;
return false;
}
mType = type;
return true;
}
public void clearType() {
mType = 0;
}
public void setColor(int colorIndex) {
if (colorIndex < 0 || colorIndex > mColor.length - 1) {
return;
}
mCurrentColorIndex = colorIndex;
}
public void clear() {
if (mShapeList.size() == 0) {
return;
}
mShapeList.clear();
mAngleMap.clear();
refreshView();
}
public boolean isEdited() {
return mShapeList.size() != 0;
}
private void add(Shape shape) {
if (!shape.isLine()) {
mShapeList.add(shape);
return;
}
Line another = (Line) shape;
if (mShapeList.size() > 0) {
Shape item = mShapeList.get(mShapeList.size() - 1);
if (item.isLine()) {
Line line = (Line) item;
if (line.angleId == 0) {
convert(line, another);
}
}
}
mShapeList.add(shape);
}
public void remove(int i) {
if (mShapeList.size() == 0) {
return;
}
Shape remove = mShapeList.remove(i);
if (!remove.isLine()) {
return;
}
Line line = (Line) remove;
if (line.angleId == 0) {
return;
}
AngleBean angleBean = mAngleMap.remove(line.angleId);
if (null == angleBean) {
return;
}
angleBean.one.angleId = 0;
angleBean.two.angleId = 0;
}
public void remove() {
if (mShapeList.size() == 0) {
return;
}
int i = mShapeList.size() - 1;
Shape remove = mShapeList.remove(i);
if (!remove.isLine()) {
return;
}
Line line = (Line) remove;
if (line.angleId == 0) {
return;
}
AngleBean angleBean = mAngleMap.remove(line.angleId);
if (null == angleBean) {
return;
}
angleBean.one.angleId = 0;
angleBean.two.angleId = 0;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mType == TYPE_LINE) {
return mLineTouchHelper.onTouch(this, event);
} else if (mType == TYPE_RECT) {
return mRectTouchHelper.onTouch(this, event);
} else if (mType == TYPE_RING) {
return mRingTouchHelper.onTouch(this, event);
} else if (mType == TYPE_CASUAL) {
return mCasualTouchHelper.onTouch(this, event);
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawEditView(canvas);
}
public void drawEditView(Canvas canvas) {
canvas.save();
for (Shape shape : mShapeList) {
shape.draw(canvas);
}
for (int i = 0; i < mAngleMap.size(); i++) {
AngleBean angleBean = mAngleMap.valueAt(i);
angleBean.draw(canvas);
}
if (null != mCurrentShape) {
mCurrentShape.draw(canvas);
}
canvas.restore();
// getBitmap(canvas);
}
private double getDistance(PointF p1, PointF p2) {
double x = Math.abs(p1.x - p2.x);
double y = Math.abs(p1.y - p2.y);
return Math.sqrt(x * x + y * y);
}
private boolean convert(Line line, Line another) {
double spacing1 = getDistance(line.start, another.start);
double spacing2 = getDistance(line.start, another.end);
double spacing3 = getDistance(line.end, another.start);
double spacing4 = getDistance(line.end, another.end);
double min = Math.min(Math.min(spacing1, spacing2), Math.min(spacing3, spacing4));
if (min > MIN_TWO_LINE_SPACING) {
return false;
}
double angle;
AngleBean angleBean;
if (min == spacing1) {
another.start.set(line.start);
angle = getAngle(line.start, line.end, another.end);
angleBean = new AngleBean(line, another, line.start, angle, mCurrentColorIndex);
} else if (min == spacing2) {
another.end.set(line.start);
angle = getAngle(line.start, line.end, another.start);
angleBean = new AngleBean(line, another, line.start, angle, mCurrentColorIndex);
} else if (min == spacing3) {
another.start.set(line.end);
angle = getAngle(line.end, line.start, another.end);
angleBean = new AngleBean(line, another, line.end, angle, mCurrentColorIndex);
} else {
another.end.set(line.end);
angle = getAngle(line.end, line.start, another.start);
angleBean = new AngleBean(line, another, line.end, angle, mCurrentColorIndex);
}
line.angleId = angleBean.id;
another.angleId = angleBean.id;
mAngleMap.put(angleBean.id, angleBean);
return true;
}
private double getAngle(PointF p1, PointF p2, PointF p3) {
double a = Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));//a
double b = Math.sqrt((p2.x - p3.x) * (p2.x - p3.x) + (p2.y - p3.y) * (p2.y - p3.y));//b
double c = Math.sqrt((p1.x - p3.x) * (p1.x - p3.x) + (p1.y - p3.y) * (p1.y - p3.y));//c
double x = (a * a - c * c + b * b) / (2 * b);
double angle = 180 - Math.toDegrees(Math.acos(x / a)) - Math.toDegrees(Math.acos((b - x) / c));
return angle;
}
public void refreshView() {
invalidate();
}
private class LineTouchHelper extends GestureDetector.SimpleOnGestureListener implements OnTouchListener {
PointF start = new PointF();
PointF end = new PointF();
boolean isOver;
boolean isDoubleClick;
long downTime;
WindowManager wm = (WindowManager) getContext()
.getSystemService(Context.WINDOW_SERVICE);
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
if (!selectedLeft) {
return false;
}
isOver = false;
long now = System.currentTimeMillis();
if (Math.abs(now - downTime) < DOUBLE_TAP_TIMEOUT) {
isDoubleClick = true;
downTime = 0;
} else {
isDoubleClick = false;
downTime = now;
}
start.set(event.getX(), event.getY());
end.set(0, 0);
refreshView();
break;
case MotionEvent.ACTION_POINTER_DOWN:
if (event.getPointerCount() > 2) {
isOver = true;
} else {
end.set(event.getX(1), event.getY(1));
if (isOver) {
if (null != mCurrentShape) {
add(mCurrentShape);
}
start.set(event.getX(), event.getY());
mCurrentShape = newInstance(new PointF(start.x, start.y), new PointF(end.x, end.y), mCurrentColorIndex);
isOver = false;
} else {
if (null == mCurrentShape) {
mCurrentShape = newInstance(new PointF(start.x, start.y), new PointF(end.x, end.y), mCurrentColorIndex);
} else if (isInstanceOf(mCurrentShape)) {
mCurrentShape.update(start, end);
}
}
refreshView();
}
break;
case MotionEvent.ACTION_MOVE:
if (isOver) {
break;
}
if (event.getPointerCount() == 1) {
end.set(event.getX(), event.getY());
if (null == mCurrentShape) {
mCurrentShape = newInstance(new PointF(start.x, start.y), new PointF(end.x, end.y), mCurrentColorIndex);
} else if (isInstanceOf(mCurrentShape)) {
mCurrentShape.update(start, end);
}
refreshView();
} else if (event.getPointerCount() == 2) {
start.set(event.getX(0), event.getY(0));
end.set(event.getX(1), event.getY(1));
if (null == mCurrentShape) {
mCurrentShape = newInstance(new PointF(start.x, start.y), new PointF(end.x, end.y), mCurrentColorIndex);
} else if (isInstanceOf(mCurrentShape)) {
mCurrentShape.update(start, end);
}
refreshView();
}
// start = end;
break;
case MotionEvent.ACTION_POINTER_UP:
isOver = true;
break;
case MotionEvent.ACTION_UP:
isOver = true;
if (end.equals(0, 0) || getDistance(start, end) < MIN_LINE_LENGTH) {
//do nothing;
if (isDoubleClick && mShapeList.size() > 0) {
remove(mShapeList.size() - 1);
refreshView();
}
mCurrentShape = null;
} else if (null != mCurrentShape) {
add(mCurrentShape);
mCurrentShape = null;
refreshView();
}
break;
}
return true;
}
protected Shape newInstance(PointF start, PointF end, int colorIndex) {
return new Line(start, end, colorIndex);
}
protected boolean isInstanceOf(Shape shape) {
return shape instanceof Line;
}
}
private class CausalLineTouchHelper implements OnTouchListener {
PointF start = new PointF();
PointF end = new PointF();
boolean isOver;
boolean isDoubleClick;
long downTime;
@Override
public boolean onTouch(View v, MotionEvent event) {
WindowManager wm = (WindowManager) getContext()
.getSystemService(Context.WINDOW_SERVICE);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
if (!selectedLeft) {
return false;
}
long now = System.currentTimeMillis();
if (Math.abs(now - downTime) < DOUBLE_TAP_TIMEOUT) {
isDoubleClick = true;
downTime = 0;
} else {
isDoubleClick = false;
downTime = now;
}
start.set(event.getX(), event.getY());
end.set(0, 0);
if (null == mCurrentShape) {
mCurrentShape = newInstance(new PointF(start.x, start.y), new PointF(end.x, end.y), mCurrentColorIndex);
}
break;
case MotionEvent.ACTION_MOVE:
if (isOver) {
break;
}
float x = event.getX();
float y = event.getY();
x = x < 0 ? 0 : (x >= getWidth() ? getWidth() : x);
end.set(x, y);
mCurrentShape.update(start, end);
refreshView();
break;
case MotionEvent.ACTION_UP:
// isOver = true;
Log.e("TAG isDouble", isDoubleClick + "");
Log.e("TAG isDouble", start.toString() + "" + end.toString());
Log.e("TAG isDouble", getDistance(start, end) + "");
if (end.equals(0, 0) || getDistance(start, end) < MIN_LINE_LENGTH) {
Log.e("TAG isDouble", isDoubleClick + "");
//do nothing;
if (isDoubleClick && mShapeList.size() > 0) {
Log.e("TAG isDouble", isDoubleClick + "");
remove(mShapeList.size() - 1);
mCurrentShape.clear();
refreshView();
}
mCurrentShape = null;
} else if (null != mCurrentShape) {
add(mCurrentShape);
mCurrentShape = null;
}
break;
}
return true;
}
protected Shape newInstance(PointF start, PointF end, int colorIndex) {
return new CasualLine(start, end, colorIndex);
}
protected boolean isInstanceOf(Shape shape) {
return shape instanceof CasualLine;
}
}
private class RectTouchHelper extends LineTouchHelper {
@Override
protected Shape newInstance(PointF start, PointF end, int colorIndex) {
return new Rectangle(start, end, colorIndex);
}
@Override
protected boolean isInstanceOf(Shape shape) {
return shape instanceof Rectangle;
}
}
private class RingTouchHelper extends LineTouchHelper {
@Override
protected Shape newInstance(PointF start, PointF end, int colorIndex) {
return new Ring(start, end, colorIndex);
}
@Override
protected boolean isInstanceOf(Shape shape) {
return shape instanceof Ring;
}
}
public interface Shape {
void update(PointF start, PointF end);
void draw(Canvas canvas);
boolean isLine();
void clear();
}
public static class Line implements Shape {
PointF start;
PointF end;
int colorIndex;
int angleId;
public Line(PointF start, PointF end, int colorIndex) {
this.start = start;
this.end = end;
this.colorIndex = colorIndex;
}
@Override
public void update(PointF start, PointF end) {
this.start.set(start.x, start.y);
this.end.set(end.x, end.y);
}
public int getColor() {
return colorIndex;
}
@Override
public boolean isLine() {
return true;
}
@Override
public void clear() {
}
@Override
public void draw(Canvas canvas) {
mShapePaint.setColor(mColor[colorIndex]);
canvas.drawLine(start.x, start.y, end.x, end.y, mShapePaint);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Line line = (Line) o;
if (start != null ? !start.equals(line.start) : line.start != null) return false;
return end != null ? end.equals(line.end) : line.end == null;
}
@Override
public int hashCode() {
int result = start != null ? start.hashCode() : 0;
result = 31 * result + (end != null ? end.hashCode() : 0);
return result;
}
}
public static class CasualLine implements Shape {
PointF start;
PointF end;
int colorIndex;
CasuialLinePath path;
int angleId;
public CasualLine(PointF start, PointF end, int colorIndex) {
this.start = start;
this.end = end;
this.colorIndex = colorIndex;
path = new CasuialLinePath();
path.moveTo(start.x, start.y);
}
public void setPath(CasuialLinePath path) {
this.path = path;
}
public int getColor() {
return colorIndex;
}
@Override
public void update(PointF start, PointF end) {
this.start.set(start.x, start.y);
this.end.set(end.x, end.y);
path.lineTo(end.x, end.y);
}
@Override
public boolean isLine() {
return false;
}
@Override
public void clear() {
path = null;
}
@Override
public void draw(Canvas canvas) {
mShapePaint.setColor(mColor[colorIndex]);
canvas.drawPath(path, mShapePaint);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CasualLine line = (CasualLine) o;
if (start != null ? !start.equals(line.start) : line.start != null) return false;
return end != null ? end.equals(line.end) : line.end == null;
}
@Override
public int hashCode() {
int result = start != null ? start.hashCode() : 0;
result = 31 * result + (end != null ? end.hashCode() : 0);
return result;
}
}
public static class Rectangle extends Line {
public Rectangle(PointF start, PointF end, int colorIndex) {
super(start, end, colorIndex);
}
@Override
public boolean isLine() {
return false;
}
@Override
public void draw(Canvas canvas) {
mShapePaint.setColor(mColor[colorIndex]);
float left = start.x <= end.x ? start.x : end.x;
float right = start.x <= end.x ? end.x : start.x;
float top = start.y <= end.y ? start.y : end.y;
float bottom = start.y <= end.y ? end.y : start.y;
canvas.drawRect(left, top, right, bottom, mShapePaint);
}
}
public static class Ring extends Rectangle {
RectF rectF = new RectF();
public Ring(PointF start, PointF end, int colorIndex) {
super(start, end, colorIndex);
}
@Override
public boolean isLine() {
return false;
}
@Override
public void draw(Canvas canvas) {
mShapePaint.setColor(mColor[colorIndex]);
float left = start.x <= end.x ? start.x : end.x;
float right = start.x <= end.x ? end.x : start.x;
float top = start.y <= end.y ? start.y : end.y;
float bottom = start.y <= end.y ? end.y : start.y;
rectF.set(left, top, right, bottom);
canvas.drawOval(rectF, mShapePaint);
}
}
private class AngleBean {
Line one;
Line two;
PointF point;
double angle;
int colorIndex;
int id;
public AngleBean(Line one, Line two, PointF point, double angle, int colorIndex) {
this.one = one;
this.two = two;
this.point = point;
this.angle = angle;
this.colorIndex = colorIndex;
this.id = ++mAngleIdIndex;
}
final int Space = 10;
public void draw(Canvas canvas) {
mAnglePaint.setColor(mColor[colorIndex]);
String angleInfo = String.valueOf((int) angle).concat("°");
Rect bound = new Rect();
mAnglePaint.getTextBounds(angleInfo, 0, angleInfo.length(), bound);
int angleWidth = bound.width();
int angleHeight = bound.height();
PointF a = getPoint(one, point);
PointF b = getPoint(two, point);
if (a.x > point.x && b.x > point.x) {
canvas.drawText(angleInfo, point.x - angleWidth - Space, point.y + angleHeight / 2, mAnglePaint);
return;
}
if (a.x < point.x && b.x < point.x) {
canvas.drawText(angleInfo, point.x + Space, point.y + angleHeight / 2, mAnglePaint);
return;
}
if (a.y < point.y && b.y < point.y) {
canvas.drawText(angleInfo, point.x - angleWidth / 2, point.y + angleHeight + Space, mAnglePaint);
return;
}
if (a.y > point.y && b.y > point.y) {
canvas.drawText(angleInfo, point.x - angleWidth / 2, point.y - Space, mAnglePaint);
return;
}
if ((a.x < point.x && a.y < point.y && b.x > point.x && b.y > point.y)
|| (b.x < point.x && b.y < point.y && a.x > point.x && a.y > point.y)) {
canvas.drawText(angleInfo, point.x + Space, point.y + angleHeight / 2, mAnglePaint);
return;
}
if ((a.x < point.x && a.y > point.y && b.x > point.x && b.y < point.y)
|| (b.x < point.x && b.y > point.y && a.x > point.x && a.y < point.y)) {
canvas.drawText(angleInfo, point.x + Space, point.y + angleHeight / 2, mAnglePaint);
return;
}
}
private PointF getPoint(Line one, PointF point) {
return one.start.equals(point) ? one.end : one.start;
}
}
}
这里是自由划线中的CasualLinePath
public class CasuialLinePath extends Path {
private List<PointF> pointFList = new ArrayList<>();
@Override
public void moveTo(float x, float y) {
super.moveTo(x, y);
pointFList.add(new PointF(x, y));
}
@Override
public void lineTo(float x, float y) {
super.lineTo(x, y);
pointFList.add(new PointF(x, y));
}
public List<PointF> getPointFList() {
return pointFList;
}
public void setPointFList(List<PointF> pointFList) {
this.pointFList = pointFList;
}
@Override
public String toString() {
return "CasuialLinePath{" +
"pointFList=" + pointFList +
'}';
}
}
这是图形的选择及使用
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = MainActivity.class.getSimpleName();
private static final int SHAPE1 = 1;
private static final int SHAPE2 = 2;
private static final int SHAPE3 = 3;
private static final int SHAPE4 = 4;
@BindView(R.id.drawEditView)
SingleDrawEditView mDrawEditView;
@BindView(R.id.iv_edit)
ImageView mEdit;
@BindView(R.id.red_area_side)
ImageView mColor1;
@BindView(R.id.blue_area_side)
ImageView mColor2;
@BindView(R.id.yellow_area_side)
ImageView mColor3;
@BindView(R.id.green_area_side)
ImageView mColor4;
@BindView(R.id.ll_vertical_side)
LinearLayout mLlVerticalSide;
@BindView(R.id.undo_side)
ImageView mUndoSide;
@BindView(R.id.clear_side)
ImageView mClearSide;
@BindView(R.id.squre_side)
ImageView mShapeRect;
@BindView(R.id.oval_side)
ImageView mShapeRing;
@BindView(R.id.line_side)
ImageView mShapeLine;
@BindView(R.id.causal_line_side)
ImageView mCausalLine;
@BindView(R.id.ll_horizontal_side)
LinearLayout mLlHorizontalSide;
private int mShape = 0;
private boolean result = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
private void setSelectColor(int i) {
switch (i) {
case 0:
mDrawEditView.setColor(0);
mColor1.setSelected(true);
mColor2.setSelected(false);
mColor3.setSelected(false);
mColor4.setSelected(false);
mShapeRect.setImageResource(R.mipmap.red_squre);
mShapeRing.setImageResource(R.mipmap.red_oval);
mShapeLine.setImageResource(R.mipmap.red_line);
mCausalLine.setImageResource(R.mipmap.red_pen);
break;
case 1:
mDrawEditView.setColor(1);
mColor1.setSelected(false);
mColor2.setSelected(true);
mColor3.setSelected(false);
mColor4.setSelected(false);
mShapeRect.setImageResource(R.mipmap.blue_squre);
mShapeRing.setImageResource(R.mipmap.blue_oval);
mShapeLine.setImageResource(R.mipmap.blue_line);
mCausalLine.setImageResource(R.mipmap.blue_pen);
break;
case 2:
mDrawEditView.setColor(2);
mColor1.setSelected(false);
mColor2.setSelected(false);
mColor3.setSelected(true);
mColor4.setSelected(false);
mShapeRect.setImageResource(R.mipmap.yellow_squre);
mShapeRing.setImageResource(R.mipmap.yellow_oval);
mShapeLine.setImageResource(R.mipmap.yellow_line);
mCausalLine.setImageResource(R.mipmap.yellow_pen);
break;
case 3:
mDrawEditView.setColor(3);
mColor1.setSelected(false);
mColor2.setSelected(false);
mColor3.setSelected(false);
mColor4.setSelected(true);
mShapeRect.setImageResource(R.mipmap.green_squre);
mShapeRing.setImageResource(R.mipmap.green_oval);
mShapeLine.setImageResource(R.mipmap.green_line);
mCausalLine.setImageResource(R.mipmap.green_pen);
break;
}
}
private void setEditLayoutVisible(boolean visible) {
if (visible) {
mLlHorizontalSide.setVisibility(View.VISIBLE);
mLlVerticalSide.setVisibility(View.VISIBLE);
mEdit.setImageResource(R.mipmap.drawclose);
} else {
mLlHorizontalSide.setVisibility(View.GONE);
mLlVerticalSide.setVisibility(View.GONE);
mEdit.setImageResource(R.mipmap.drawopen);
}
}
@OnClick({R.id.iv_edit, R.id.red_area_side, R.id.blue_area_side, R.id.yellow_area_side, R.id.green_area_side, R.id.undo_side, R.id.clear_side, R.id.squre_side, R.id.oval_side, R.id.line_side, R.id.causal_line_side})
public void onClick(View view) {
switch (view.getId()) {
case R.id.iv_edit:
setEditLayoutVisible(mLlHorizontalSide.getVisibility() == View.GONE);
break;
case R.id.red_area_side:
setSelectColor(0);
break;
case R.id.blue_area_side:
setSelectColor(1);
break;
case R.id.yellow_area_side:
setSelectColor(2);
break;
case R.id.green_area_side:
setSelectColor(3);
break;
case R.id.undo_side:
mDrawEditView.remove();
mDrawEditView.refreshView();
break;
case R.id.clear_side:
mDrawEditView.clear();
break;
case R.id.squre_side:
if (mShape != SHAPE1) {
mShape = SHAPE1;
mShapeRing.setBackgroundResource(0);
mShapeLine.setBackgroundResource(0);
mCausalLine.setBackgroundResource(0);
mShapeRect.setBackgroundResource(R.mipmap.selectshape);
result = mDrawEditView.setType(DrawEditView.TYPE_RECT);
mShapeRect.setSelected(result);
mShapeRing.setSelected(false);
mShapeLine.setSelected(false);
} else {
mShape = 0;
mShapeRect.setSelected(false);
mDrawEditView.setType(0);
mShapeRect.setBackgroundResource(0);
}
break;
case R.id.oval_side:
if (mShape != SHAPE2) {
mShape = SHAPE2;
mShapeRect.setBackgroundResource(0);
mShapeLine.setBackgroundResource(0);
mCausalLine.setBackgroundResource(0);
mShapeRing.setBackgroundResource(R.mipmap.selectshape);
result = mDrawEditView.setType(DrawEditView.TYPE_RING);
mShapeRect.setSelected(false);
mShapeRing.setSelected(result);
mShapeLine.setSelected(false);
} else {
mShape = 0;
mShapeRing.setSelected(false);
mDrawEditView.setType(0);
mShapeRing.setBackgroundResource(0);
}
break;
case R.id.line_side:
if (mShape != SHAPE3) {
mShape = SHAPE3;
mShapeRect.setBackgroundResource(0);
mShapeRing.setBackgroundResource(0);
mCausalLine.setBackgroundResource(0);
mShapeLine.setBackgroundResource(R.mipmap.selectshape);
result = mDrawEditView.setType(DrawEditView.TYPE_LINE);
mShapeRect.setSelected(false);
mShapeRing.setSelected(false);
mShapeLine.setSelected(result);
} else {
mShape = 0;
mShapeLine.setSelected(false);
mDrawEditView.setType(0);
mShapeLine.setBackgroundResource(0);
}
break;
case R.id.causal_line_side:
if (mShape != SHAPE4) {
mShape = SHAPE4;
mShapeRect.setBackgroundResource(0);
mShapeRing.setBackgroundResource(0);
mShapeLine.setBackgroundResource(0);
mCausalLine.setBackgroundResource(R.mipmap.selectshape);
result = mDrawEditView.setType(DrawEditView.TYPE_CASUAL);
mCausalLine.setSelected(result);
mShapeRect.setSelected(false);
mShapeRing.setSelected(false);
mShapeLine.setSelected(false);
} else {
mShape = 0;
mCausalLine.setSelected(false);
mDrawEditView.setType(0);
mCausalLine.setBackgroundResource(0);
}
break;
}
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray"
tools:context="com.example.yzk.bledemo.MainActivity">
<com.example.yzk.bledemo.SingleDrawEditView
android:id="@+id/drawEditView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_edit"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:layout_marginRight="20dp"
android:layout_alignParentRight="true"
android:scaleType="center"
android:src="@mipmap/drawopen"/>
<LinearLayout
android:id="@+id/ll_vertical_side"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_below="@id/iv_edit"
android:layout_marginRight="20dp"
android:layout_alignParentRight="true"
android:orientation="vertical"
android:background="#3f2b2b2b"
android:visibility="gone"
>
<ImageView
android:id="@+id/red_area_side"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/red_area"
android:layout_gravity="center"
android:paddingTop="15dp"
android:paddingBottom="5dp"
/>
<ImageView
android:id="@+id/blue_area_side"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/blue_area"
android:layout_gravity="center"
android:paddingTop="5dp"
android:paddingBottom="5dp"
/>
<ImageView
android:id="@+id/yellow_area_side"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/yellow_area"
android:layout_gravity="center"
android:paddingTop="5dp"
android:paddingBottom="5dp"
/>
<ImageView
android:id="@+id/green_area_side"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/green_area"
android:layout_gravity="center"
android:paddingTop="5dp"
android:paddingBottom="15dp"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_horizontal_side"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:background="#3f2b2b2b"
android:orientation="horizontal"
android:layout_toLeftOf="@id/iv_edit"
android:layout_marginTop="20dp"
android:visibility="gone"
>
<ImageView
android:id="@+id/undo_side"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@mipmap/penundo"
android:paddingLeft="15dp"
android:paddingRight="5dp"
/>
<ImageView
android:id="@+id/clear_side"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@mipmap/penclear"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:layout_gravity="center"
/>
<ImageView
android:id="@+id/squre_side"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@mipmap/red_squre"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:layout_gravity="center"
/>
<ImageView
android:id="@+id/oval_side"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@mipmap/red_oval"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:layout_gravity="center"
/>
<ImageView
android:id="@+id/line_side"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@mipmap/red_line"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:layout_gravity="center"
/>
<ImageView
android:id="@+id/causal_line_side"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@mipmap/red_pen"
android:paddingLeft="5dp"
android:paddingRight="15dp"
android:layout_gravity="center"
/>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
可以直接去下载代码,已上传资源 (屏幕划线的代码module)
http://download.csdn.net/detail/yanzhikai_/9828356
希望对你有帮助Thank You ;