Android---绘图机制---Canvas与Paint

系统通过提供Canvas对象来提供绘图方法,并且提供了绘制图像的API
例如:
drawPoint(点).drawLine(线). drawRect(矩形). drawVertices(多边形).drawArc(弧). drawCircle(圆)等等.

//获取屏幕的宽高
        WindowManager wm = (WindowManager) getContext()
                .getSystemService(Context.WINDOW_SERVICE);

        width = wm.getDefaultDisplay().getWidth();
        height = wm.getDefaultDisplay().getHeight();

Paint

作为一个非常重要的元素,功能也是很强大的以下是一些基础的属性和对应的功能

  • setAntiAlias(); //设置画笔的锯齿效果
  • setColor(); //设置画笔的颜色
  • setARGB(); //设置画笔的A、R、G、B值
  • setAlpha(); //设置画笔的Alpha值
  • setTextSize(); //设置字体的尺寸
  • setStyle(); //设置画笔的风格(空心或实心)
  • setStrokeWidth(); //设置空心边框的宽度
  • getColor(); //获取画笔的颜色

代码:

        paint1 = new Paint();
        paint1.setColor(Color.BLUE);
        paint1.setAntiAlias(true);
        //空心
        paint1.setStyle(Paint.Style.STROKE);
        paint2 = new Paint();
        paint2.setColor(Color.GREEN);
        //实心
        paint2.setStyle(Paint.Style.FILL);

效果图:
这里写图片描述

Canvas

四种常用的方法

        canvas.save();          //保存画布
        canvas.restore();       //合并图层
        canvas.translate(x,y);  //画布平移到x,y处
        canvas.rotate(翻转的角度,圆心的X坐标,圆心的Y坐标);//画布翻转

绘制钟表的源代码:

public class Clock extends View{

    private int mWidth;
    private int mHeight;
    private Paint paintCircle,paintDegree;

    public Clock(Context context, AttributeSet attrs) {
        super(context, attrs);
        WindowManager windowManager=
                (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        mHeight=windowManager.getDefaultDisplay().getHeight();
        mWidth=windowManager.getDefaultDisplay().getWidth();;
    }


    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        //画圆
        paintCircle=new Paint();
        paintCircle.setAntiAlias(true);
        paintCircle.setStyle(Paint.Style.STROKE);//设置空心
        paintCircle.setStrokeWidth(5);           //设置空心圆宽度
        canvas.drawCircle(mWidth/2,mHeight/2,mWidth/2,paintCircle);
        //画刻度
        paintDegree=new Paint();
        paintDegree.setAntiAlias(true);
        paintDegree.setStrokeWidth(3);
            //区分是否是整点
        for (int i=0;i<12;i++){
            //区分整点和飞整点i
            if(i==0||i==3||i==6||i==9){
                paintDegree.setStrokeWidth(5);
                paintDegree.setTextSize(30);
                canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+60,paintDegree);
                String degree = String.valueOf(i);
                Log.e(TAG, degree );
                canvas.drawText(degree,
                        mWidth/2-paintDegree.measureText(degree)/2,
                        mHeight/2-mWidth/2+90,paintDegree);
            }else {
                paintDegree.setStrokeWidth(3);
                canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+30,paintDegree);

            }
            //旋转30度
            canvas.rotate(30,mWidth/2,mHeight/2);
        }
    //画指针
        Paint paintHour=new Paint();
        paintHour.setAntiAlias(true);
        paintHour.setStrokeWidth(20);
        Paint paintMinute=new Paint();
        paintMinute.setAntiAlias(true);
        paintMinute.setStrokeWidth(10);
        canvas.save();
        canvas.translate(mWidth/2,mHeight/2);
        canvas.drawLine(0,0,100,100,paintHour);
        canvas.drawLine(0,0,100,200,paintMinute);
    }
}

这里写图片描述
DrawPoint 绘制点
canvas.drawPoint(x,y,paint);

DrawLine绘制直线

canvas.drawLine(startX,startY,endX,endY,paint);
绘制多条直线:
float[] pts1={startX1,startY1,endX1,endY1…startXn,startYnendXn,endYn};
canvas.drawLines(pts,paint);

DrawRect绘制矩形
canvas.drawRect(left,top,right,button,paint);

DrawRoundRect绘制圆角矩形
canvas.drawRect(left,top,right,button,radiusX,radiusY,paint);

DrawCircle绘制圆
canvas.drawCircle(圆心X坐标,Y坐标,半径,paint1);

DrawArc绘制弧形/扇形
两种写法:
第一种:canvas.drawArc(left,top,right,button, startAngle, sweepAngle, useCenter, paint2);
第二种:
RectF rectF = new RectF(left,top,right,button);
canvas.drawArc(rectF, 0, 100, true, paint2);
在这里rectF代表的是圆弧外轮扩矩形区域
startAngle表示起始的角度 (以X轴正方向为0度顺时针开始算)
sweepAngle为圆弧扫过的角度
useCenter设置为true的时候显示圆心
这里写图片描述

DrawPath绘制路径
绘制多边形

        //实例化路径
        Path path = new Path();
        path.moveTo(80, 200);// 此点为多边形的起点
        path.lineTo(120, 250);
        path.lineTo(80, 250);
        path.lineTo(300, 300);
        //path.close(); // 使这些点构成封闭的多边形
        canvas.drawPath(path, paint1);

绘制曲线:

        Path path=new Path();
        path.moveTo(100, 320);          //设置Path的起点
        path.quadTo(160,320,180,410);   //设置路径点和终点
        canvas.drawPath(path, paint1);

这里写图片描述
DrawOval绘制椭圆
DrawOval(left,top,right,button,paint);

RectF rectF = new RectF(210,100,250,130) ;
 canvas.drawOval(rectF, paint2) ;

DrawText绘制文本
canvas.drawText(“自定义文本”,X坐标,Y坐标,paint);
绘制不同位置的文本信息

float [] pts=new float[]{100,100,200,200,300,300,400,400,500,500,600,600};
        canvas.drawPosText("text",pts,paint1);

效果图:
不同位置绘制文本信息

Layer图层

重要方法:

        //以下两个方法图层入栈
        canvas.saveLayer();
        canvas.saveLayerAlpha();
        //以下两个方法图层出栈
        canvas.restore();
        canvas.restoreToCount();

canvas.saveLayerAlpha(0, 0,400,400,255,LAYER_TYPE_NONE);
第四个值是透明度范围在0-255之间
canvas.restore();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值