屏幕划线-矩形,圆,任意划线,多点触摸直线划线及角度显示

  矩形,圆,直线其实都是两个点来决定的,自由划线相对麻烦些,我们实际项目中还需要把这些点保存,在屏幕旋转时能够保持这些图形的准确位置,因为我们用在视频的讲解上,划线也是在视频画面上绘制.

在这里还添加了画笔颜色选择,双击撤销上一部操作的功能 , 还有角度的计算 显示 , 下面,慢慢欣赏代码吧

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 ;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值