DrawView与ClipView(剪切)方法详解

DrawView 一个绘制各种图形的方法。

public class DrawView extends View{
    public DrawView(Context context) {
        super(context);
    }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.BLACK);

        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawText("画圆",10,20,paint);
        canvas.drawCircle(60,20,10,paint);   //小圆
        paint.setAntiAlias(true);   //设置抗锯齿,去除笔的毛茬
        canvas.drawCircle(120,20,20,paint);  //大圆

        canvas.drawText("画线和弧线",10,60,paint);
        paint.setColor(Color.GREEN);
        canvas.drawLine(60,40,100,40,paint);   //画直线,和宽度平行
        canvas.drawLine(110,40,190,80,paint);   //画斜线
        //绘制弧线
        //canvans.drawArc
        //drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
        //设置是空心的
        paint.setStyle(Paint.Style.STROKE);
        //设置圆弧的外切矩形
        RectF oval = new RectF(150,20,180,40);
        canvas.drawArc(oval,180,180,false,paint);
        //重新设置矩形的位置
        oval.set(190,20,220,40);
        canvas.drawArc(oval,180,180,false,paint);
        oval.set(170,30,200,60);
        canvas.drawArc(oval,0,180,false,paint);

        canvas.drawText("画矩形",10,80,paint);
        paint.setColor(Color.GRAY);
        paint.setStyle(Paint.Style.FILL);   //设置实心
        canvas.drawRect(80,80,100,100,paint);    //左上右下  ,绘制正方形
        canvas.drawRect(110,80,180,90,paint);    //矩形

        canvas.drawText("画扇形和椭圆形",10,120,paint);

        Shader shader = new LinearGradient(0,0,100,100,new int[]{Color.RED,Color.GREEN,Color.YELLOW,Color.BLUE,Color.GRAY}
        ,null, Shader.TileMode.REPEAT);

        paint.setShader(shader);    //设置渲染的颜色

        RectF rectF = new RectF(120,100,260,240);
        //画扇形
        canvas.drawArc(rectF,200,150,true,paint);

        //画椭圆
        rectF.set(280,100,320,130);
        canvas.drawOval(rectF,paint);

        canvas.drawText("画三角形",10,200,paint);

        Path path = new Path();
        path.moveTo(80,200);  //定义多边形的起点
        path.lineTo(120,250);
        path.lineTo(80,250);
        path.close();   //使每个点变成封闭的几何图形
        canvas.drawPath(path,paint);

        canvas.drawText("画圆角矩形",10,280,paint);
        RectF rectF1 = new RectF(80,290,220,330);
        canvas.drawRoundRect(rectF1,20,20,paint);

        //画贝塞尔曲线
        canvas.drawText("画贝塞尔曲线",10,350,paint);
        paint.reset();   //重置画笔
        paint.setColor(Color.GRAY);
        paint.setStrokeWidth(8);
        paint.setStyle(Paint.Style.STROKE);

        Path path2 = new Path();
        path2.moveTo(100,350);
        path2.quadTo(150,340,170,430);    //设置贝塞尔曲线的控制点坐标和终点坐标
        canvas.drawPath(path2,paint);

        //绘制图片,花上去一张图片
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.d_doge);
        canvas.drawBitmap(bitmap,250,350,paint);
    }
}

ClipView剪切某一块区域的一个方法

public class ClipView extends View{
    private Paint mPaint;
    public ClipView(Context context) {
        super(context);
    }

    public ClipView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        mPaint.setColor(Color.GREEN);
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(6);
        mPaint.setTextSize(16);
        mPaint.setTextAlign(Paint.Align.RIGHT);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.GRAY);

        //保存画布上的原始状态
        canvas.save();
        canvas.translate(10,10);  //移动画布
        drawScence(canvas);
        canvas.restore();

        canvas.save();
        canvas.translate(160,10);
        canvas.clipRect(10,10,90,90);

        canvas.clipRect(30,30,70,70, Region.Op.REPLACE);
        //DIFFERENCE:第一次剪切和第二次剪切不同的地方显示出来。
        //INTERSECT:显示两次剪切的交集
        //REPLACE :只显示第二次的结果
        //REVERSE_DIFFERENCE:只显示第二次不同于第一次的部分
        //UNION  :全部都显示出来。
        //XOR : 补集显示,全部的部分减去相交的部分
        drawScence(canvas);
        canvas.restore();
    }
    public void drawScence(Canvas canvas){
        canvas.clipRect(0,0,100,100);
        canvas.drawColor(Color.WHITE);
        mPaint.setColor(Color.RED);

        canvas.drawLine(0,0,100,100,mPaint);
        mPaint.setColor(Color.GREEN);
        canvas.drawCircle(30,70,30,mPaint);

        mPaint.setColor(Color.BLUE);
        canvas.drawText("剪切",50,20,mPaint);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值