zoukankan      html  css  js  c++  java
  • Android-自定义控件之绘图基础

    画圆形,效果图:

    布局中去指定自定义View:

    <view.custom.androidcustomviewbook.a_draw_base.BaseView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    在代码中去绘制圆形:

    public class BaseView extends View {
    
        public BaseView(Context context) {
            super(context);
        }
    
        public BaseView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public BaseView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            // 设置画笔的基本属性
            Paint paint = new Paint();
            // 设置画笔的颜色
            paint.setColor(Color.BLUE);
            // 设置画笔填充的样式
            paint.setStyle(Paint.Style.FILL);
            // 设置画笔的宽度
            paint.setStrokeWidth(60);
    
            // 设置画布,把画笔画上去,画布是圆形
            canvas.drawCircle(300,300,160, paint);
        }
    }

    圆形并填充内部,效果图:

    下面是绘制的代码:

    public class BaseView extends View {
        public BaseView(Context context) {
            super(context);
        }
    
        public BaseView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public BaseView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            Paint paint = new Paint();
            paint.setColor(0xFFFF0000);
    
            paint.setStyle(Paint.Style.FILL); // 仅填充内部
            // paint.setStyle(Paint.Style.FILL_AND_STROKE); // 填充内部和描边
            // paint.setStyle(Paint.Style.STROKE); // 仅描边
    
            paint.setStrokeWidth(80); // 单位是px,需要设置为FILL_AND_STROKE才有效
    
            canvas.drawCircle(300, 800, 160, paint);
    
            paint.setColor(0x7EFFFF00);
            canvas.drawCircle(300, 800, 130, paint);
        }
    }

    画一条线,画一个点,Rect,RectF相关知识:

    public class BaseView extends View{
    
        public BaseView(Context context) {
            super(context);
        }
    
        public BaseView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public BaseView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            // canvas.drawColor(0xFFFF00FF);
            // canvas.drawRGB(255, 0, 255);
    
            // 注意:drawLine与setStyle无关,不管设置什么样式,再设置setStrokeWidth是生效的
    
            // 画一条直线
            /*Paint paint = new Paint();
            paint.setColor(Color.RED);
            paint.setStyle(Paint.Style.FILL_AND_STROKE);
            paint.setStrokeWidth(6);
    
            canvas.drawLine(200, 200, 400, 200, paint);*/
    
            /*// 画点 画点和画线一样 与 drawLine与setStyle无关
            Paint mPaint = new Paint();
            mPaint.setColor(Color.RED);
            mPaint.setStrokeWidth(9);
    
            canvas.drawPoint(200,200, mPaint);*/
    
            // Rect
            Paint paint = new Paint();
            paint.setColor(Color.BLUE);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(20);
    
            // 直接构造
            // canvas.drawRect(10, 10, 100, 100, paint);
    
            // 使用RectF构造
            RectF  rectF = new RectF(10f, 10f, 100f, 100f);
            canvas.drawRect(rectF, paint);
    
        }
    }

    效果图:


    路径(Path),区域(Region),配合绘制操作:

    public class BaseView4 extends View {
    
        public BaseView4(Context context) {
            super(context);
        }
    
        public BaseView4(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public BaseView4(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            // 路径 path
            /*Paint mPaint = new Paint();
            mPaint.setColor(Color.YELLOW);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(6);*/
    
            /*Path mPath = new Path();
            mPath.moveTo(200, 200); // 设置起始点
            mPath.lineTo(300, 800); // 第一条直线的终点,也是第二条线的起始点
            mPath.lineTo(600, 800); // 画第二条线的起始点
            mPath.close(); // 闭环
    
            canvas.drawPath(mPath, mPaint);*/
    
            /*Path mPaht = new Path();
            mPaht.moveTo(10, 10); // 设置起始位置
            RectF rectF = new RectF(100, 10, 200, 100);
            // mPaht.addArc(rectF, 0, 90);
            // mPaht.arcTo(rectF, 0 ,99);
            mPaht.arcTo(rectF, 0 ,99, true);
    
            canvas.drawPath(mPaht, mPaint);*/
    
            /*Paint mPaint = new Paint();
            mPaint.setColor(Color.RED);
            mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
            mPaint.setStrokeWidth(6);
    
            // 区域的意思
            Region region = new Region(new Rect(10, 20, 60, 80));
    
            // 定义Region迭代器
            RegionIterator regionIterator = new RegionIterator(region);
    
            Rect rect = new Rect();
    
            while (regionIterator.next(rect)) {
                canvas.drawRect(rect, mPaint);
            }*/
    
            /*Paint paint = new Paint();
            paint.setColor(Color.BLUE);
            paint.setStyle(Paint.Style.FILL);
            paint.setStrokeWidth(6);*/
    
            /*// 构造一条椭圆路径
            Path ovalPaht = new Path();
            RectF rectF = new RectF(50, 50, 200, 500);
            ovalPaht.addOval(rectF, Path.Direction.CCW);
    
            // 【区域】 在 setPath方法中,传入椭圆区域小的矩形区域,让其区交集
            Region region = new Region();
            region.setPath(ovalPaht, new Region(50, 50, 200, 200));
    
            // 画出路径
            Rect r = new Rect();
            RegionIterator regionIterator = new RegionIterator(region);
            while (regionIterator.next(r)) {
                canvas.drawRect(r, paint);
            }*/
    
            // 区域相交
            /*Region region = new Region(10, 10, 200, 100);
            region.union(new Rect(10, 10, 50, 300));
            RegionIterator regionIterator = new RegionIterator(region);
            Rect resultRect = new Rect();
            while(regionIterator.next(resultRect)) {
                canvas.drawRect(resultRect, paint);
            }*/
    
            /**
             * 区域更加灵活的操作
             */
            // 构建出两个矩形
            Rect rect1 = new Rect(100, 100, 400, 200);
            Rect rect2 = new Rect(200, 0, 300, 300);
    
            // 需要一个画笔,可以画出矩形的轮廓
            Paint paint = new Paint();
            paint.setColor(Color.BLUE);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(2);
    
            canvas.drawRect(rect1, paint);
            canvas.drawRect(rect2, paint);
    
            // 然后利用 rect1 rect2 来构造 Region,并在rect1的基础上与rect2来交集
            Region region1 = new Region(rect1);
            Region region2 = new Region(rect2);
    
            // 进行交集
            // region1.op(region2, Region.Op.INTERSECT);
            region1.op(region2, Region.Op.DIFFERENCE);
    
            // 在搞个画笔,所选区域用绿色去填充
            Paint paint2 = new Paint();
            paint2.setColor(Color.GREEN);
            paint2.setStyle(Paint.Style.FILL);
    
            RegionIterator regionIterator = new RegionIterator(region1);
            Rect resultRect = new Rect();
            while (regionIterator.next(resultRect)) {
                canvas.drawRect(resultRect, paint2);
            }
        }
    }

    效果图:


    平移:

    public class BaseView5 extends View {
    
        public BaseView5(Context context) {
            super(context);
        }
    
        public BaseView5(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public BaseView5(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            // 平移 translate
            /*Paint paint = new Paint();
            paint.setColor(Color.BLUE);
            paint.setStyle(Paint.Style.FILL);
    
            canvas.translate(200, 100);
    
            canvas.drawRect(new Rect(10, 10, 400, 220), paint);*/
    
            /**
             * 定义两个画笔,一个红色画笔,一个绿色画笔
             */
            Paint paintRed = new Paint();
            paintRed.setColor(Color.RED);
            paintRed.setStyle(Paint.Style.STROKE);
            paintRed.setStrokeWidth(2);
    
            Paint paintGreen = new Paint();
            paintGreen.setColor(Color.GREEN);
            paintGreen.setStyle(Paint.Style.STROKE);
            paintGreen.setStrokeWidth(2);
    
            // 构建一个矩形
            Rect rect = new Rect(10, 10, 400, 200);
            canvas.drawRect(rect, paintRed);
    
            // 进行平移
            canvas.translate(200, 400);
    
            canvas.drawRect(rect, paintGreen);
    
        }
    }

    效果图:


    裁剪:

    public class BaseView6 extends View {
    
    
        public BaseView6(Context context) {
            super(context);
        }
    
        public BaseView6(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public BaseView6(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            canvas.drawColor(Color.YELLOW);
            // 保存当前画笔大小,整个屏
            canvas.save();
    
            // 裁剪
            // canvas.drawColor(Color.BLUE);
            canvas.clipRect(new Rect(100, 100, 400, 800));
            canvas.drawColor(Color.RED);
    
            // 恢复 整个屏 然后设置蓝色
            // canvas.restore();
            // canvas.drawColor(Color.BLUE);
        }
    }

    效果图:

  • 相关阅读:
    UVALive
    UVALive
    UVA
    UVALive
    BZOJ3597 SCOI2014方伯伯运椰子(分数规划+spfa)
    BZOJ3456 城市规划(多项式求逆)
    BZOJ4182 Shopping(点分治+树形dp)
    BZOJ4383 Pustynia(线段树+拓扑排序)
    BZOJ4445 SCOI2015小凸想跑步(半平面交)
    BZOJ5311 贞鱼(动态规划+wqs二分+决策单调性)
  • 原文地址:https://www.cnblogs.com/android-deli/p/9661758.html
Copyright © 2011-2022 走看看