画笔Paint及Canvas的简单应用(线 点 圆 矩形 扇形)

Android中Paint字体属性的设置
在Android SDK中使用Typeface类来定义字体,可以通过常用字体类型名称进行设置,如设置默认黑体:
Paint mp = new paint();
mp.setTypeface(Typeface.DEFAULT_BOLD)

常用的字体类型名称还有:
* Typeface.DEFAULT //常规字体类型
* Typeface.DEFAULT_BOLD //黑体字体类型
* Typeface.MONOSPACE //等宽字体类型
* Typeface.SANS_SERIF //sans serif字体类型
* Typeface.SERIF //serif字体类型
除了字体类型设置之外,还可以为字体类型设置字体风格,如设置粗体:
Paint mp = new Paint();
Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
p.setTypeface( font );

常用的字体风格名称还有:
* Typeface.BOLD //粗体
* Typeface.BOLD_ITALIC //粗斜体
* Typeface.ITALIC //斜体
* Typeface.NORMAL //常规

但是有时上面那些设置在绘图过程中是不起作用的,所以还有如下设置方式:
Paint mp = new Paint();
mp.setFakeBoldText(true); //true为粗体,false为非粗体
mp.setTextSkewX(-0.5f); //float类型参数,负数表示右斜,整数左斜
mp.setUnderlineText(true); //true为下划线,false为非下划线
mp.setStrikeThruText(true); //true为删除线,false为非删除线

Paint常用的方法还有:
mp.setTextSize(); //设置字体大小,int型,如12
mp.setStrokeWidth(w); //设置线宽,float型,如2.5f,默认绘文本无需设置(默认值好像为0),但假如设置了,再绘制文本的时候一定要恢复到0

 

在Android中需要通过graphics类来显示2D图形。

  graphics中包括了Canvas(画布)、Paint(画笔)、Color(颜色)、Bitmap(图像)等常用的类。graphics具有绘制点、线、颜色、2D几何图形、图像处理等功能。

  1.Color(颜色)类

  Android系统中颜色的常用表示方法有以下3种:

  (1)int color = Color.BLUE;

  (2)int color = Color.argb(150,200,0,100);

  (3)在xml文件中定义颜色;

  在实际应用当中,我们常用的颜色有以下一些,其颜色常量及其表示的颜色如下所示:

  Color.BLACK      黑色                                       Color.GREEN                  绿色

  Color.BLUE        蓝色                                       Color.LTGRAY                浅灰色

  Color.CYAN       青绿色                                     Color.MAGENTA              红紫色

  Color.DKGRAY    灰黑色                                    Color.RED                      红色

  Color.YELLOW    黄色                                       Color.TRANSPARENT       透明

  Color.GRAY        灰色                                       Color.WHITE                  白色

   2.Paint(画笔)类

   要绘制图形,首先得调整画笔,按照自己的开发需要设置画笔的相关属性。Pain类的常用属性设置方法如下:

  setAntiAlias();            //设置画笔的锯齿效果

  setColor();                 //设置画笔的颜色

  setARGB();                 //设置画笔的A、R、G、B值

  setAlpha();                 //设置画笔的Alpha值

  setTextSize();             //设置字体的尺寸

  setStyle();                  //设置画笔的风格(空心或实心) Paint.Style.STORKE 代表空心, FILL 代表实心

  setStrokeWidth();        //设置空心边框的宽度

  getColor();                  //获取画笔的颜色

  3.Canvas(画布)类

  画笔属性设置好之后,还需要将图像绘制到画布上。Canvas类可以用来实现各种图形的绘制工作,如绘制直线、矩形、圆等等。Canvas绘制常用图形的方法如下:

  绘制直线:canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint);

  绘制矩形:canvas.drawRect(float left, float top, float right, float bottom, Paint paint);

  绘制圆形:canvas.drawCircle(float cx, float cy, float radius, Paint paint);

  绘制字符:canvas.drawText(String text, float x, float y, Paint paint);

  绘制图形:canvas.drawBirmap(Bitmap bitmap, float left, float top, Paint paint);

小例子:   画,所参考的坐标指的是当前类指的控件,也就是this, 所有(0,0)指的是你这个控件的左上方,而不是屏幕

public class MyView extends View {

    private Paint paint;

    public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setStrokeWidth(6);//宽度
        paint.setColor(0xffff0000);
        //画点
        // float x, 点的x坐标  float y,  点的y坐标
       canvas.drawPoint(100,100,paint);

        //画线
        paint.setColor(0xff00ff00);
        paint.setStrokeWidth(4);
        //参数1,2线的起点坐标   参数3,4,终点坐标
        canvas.drawLine(0,0,20,100,paint);

        //圆形
        paint.setColor(0xff0000ff);
        //设置图形的的样式  Paint.Style.STROKE  描图形的边缘(空心)   Paint.Style.FILL 填充满图形
        paint.setStyle(Paint.Style.FILL);
        //参数1,2确定圆心的位置, 参数3.半径
        canvas.drawCircle(300,400,50,paint);

        //长方形
        paint.setStyle(Paint.Style.STROKE);//空心
        paint.setStrokeWidth(3);//线宽
        canvas.drawRect(50,50,150,150,paint);//左上方(50,50),右下方(150,150)

        //直接创建一个矩形
        RectF rectF = new RectF(50, 50, 150, 150);
        //扇形
     /*   RectF oval, 约束扇形的矩形,完整的扇形会与该矩形的四条边相切
        float startAngle  扇形的起始度数(默认圆心水平与最右侧的连接线)
        float sweepAngle,  旋转的度数 .(顺时针旋转)
        boolean useCenter, 表示扇形的边点是否与圆心连接
        Paint paint*/
        canvas.drawArc(rectF,0,90,false,paint);

        //文本
        paint.setStrokeWidth(0.2f);
        paint.setStyle(Paint.Style.FILL);
        paint.setTextSize(40);
        canvas.drawText("我是",400,50,paint);
    }
}

效果图:

 

Paint 代表了Canvas上的画笔、画刷、颜料等等;
Paint类常用方法:
setARGB(int a, int r, int g, int b) // 设置 Paint对象颜色,参数一为alpha透明值
setAlpha(int a) // 设置alpha不透明度,范围为0~255
setAntiAlias(boolean aa) // 是否抗锯齿
setColor(int color) // 设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义
setTextScaleX(float scaleX) // 设置文本缩放倍数,1.0f为原始
setTextSize(float textSize) // 设置字体大小
setUnderlineText(booleanunderlineText) // 设置下划线


/*canvas.drawText("请输入内容", 10, getHeight()/2, paint);
        
        
        *//**
         * cx, 绘制时圆心x轴的坐标
         * cy, 绘制时圆心y轴的坐标
         * radius:半径
         * paint
         *//*
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(100, 200, 10, paint);
        canvas.drawCircle(230, 200, 30, paint);
        
        // TODO Auto-generated method stub
        //具体绘画通过canvas实现
        canvas.drawLine(0, 0, getWidth(), getHeight(), paint);*/
        
        /*//绘制正方形
                paint.setColor(Color.MAGENTA);
                //paint.setColor(Color.rgb(0, 255, 22));
                *//**
                 * 1.left:绘制矩形时左边缘的坐标
                 * 2.top:绘制矩形时顶部的坐标,y轴坐标
                 * 3.right:
                 * 4.bottom
                 *//*
                canvas.drawRect(60, 280, 200, 420, paint);
                //绘制长方形
                canvas.drawRect(220, 280, 300, 300, paint);*/
            
                
                //绘制弧线
                paint.setStyle(Paint.Style.STROKE);//空心
                RectF rectF = new RectF(150, 20, 180, 40);
                /**
                 * oval:RectF对象,指定弧线的外面的轮廓
                 * startAngle:弧线起始的角度
                 * sweepAngle:弧线扫过的角度
                 * useCenter:if true 将圆心包含在内,if false
                 * paint
                 */
                canvas.drawArc(rectF, 180, 180, false, paint);
            /*    //右眼
                RectF rectF2 = new RectF(210, 20, 240, 40);
                canvas.drawArc(rectF2, 180, 180, false, paint);
                //嘴巴
                RectF rectF3 = new RectF(180, 60, 210, 70);
                canvas.drawArc(rectF3, 0, 180, false, paint);*/

// TODO Auto-generated method stub
        //具体绘画通过canvas实现
        canvas.drawLine(0, 0, getWidth(), getHeight(), paint);
        //画线
//        canvas.drawLine(0, 0, getWidth(), getHeight(), paint);
        //画圆
//        canvas.drawCircle(cx, cy, radius, paint);
        //画弧线
        //第一个参数是说,画的弧线是属于哪个圆的一部分
        //第二个参数是说,开始的度数,(从圆心水平右射线顺时针方向转的角度)
        //第三个参数是说,弧线的度数(不是结束的度数)
        //第四个参数是说,是否连接中心点
        //第五个参数是画笔
//        canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint)
        //画bitmap
        //第一个参数,画哪个bitmap
        //第二个参数和第三个参数是说,画这个bitmap左边界和上边界的坐标值
        //第四个参数是画笔
//        canvas.drawBitmap(bitmap, left, top, paint)
        //画一组线
        //第一个参数是一组坐标点
        //第二个参数是画笔
//        canvas.drawLines(pts, paint)
        //画椭圆
        //使用一个Rectf对象来确认要画的椭圆,第二个参数是画笔
//        canvas.drawOval(oval, paint);
        //绘制路径
        //给定一个路径,用paint绘制出来,此方法为底层方法。
//        canvas.drawPath(path, paint);
        //画点
        //前两个参数是横纵坐标
        //第二个参数是画笔
//        canvas.drawPoint(x, y, paint)
        //画矩形
        //前四个参数是限定矩形的位置
        //第五个参数是画笔
//        canvas.drawRect(left, top, right, bottom, paint)
        //画圆角矩形
        //第一个参数是矩形的位置
        //第二个参数和第三个参数是圆角矩形中圆角的大小
        //第四个参数是画笔
//        canvas.drawRoundRect(rect, rx, ry, paint);
        //画文字
        //第一个参数是说绘制的内容
        //第二、第三个参数来确认从哪里绘制
        //第四个参数是画笔ABCDQg
//        canvas.drawText(text, x, y, paint)


// 1、将会以颜色ARBG填充整个控件的Canvas背景 //mCanvas.drawARGB(122, 10, 159, 163) ; // 2、将会以颜色ARBG填充整个控件的Canvas背景 //mCanvas.drawColor(Color.BLUE) ; // 3、绘制颜色,但是要制定一个mode //mCanvas.drawColor(Color.BLUE, Mode.SCREEN) ; // 4、画背景,跟2等效 //mCanvas.drawPaint(mPaint) ; // 5、画一个点 //mCanvas.drawPoint(23, 23, mPaint) ; // 6、画很多点这里的float[] 表示{x0,y0,x1,y1,x2,y2,x3,y3.....} //mCanvas.drawPoints(new float[]{10,11,10,12,10,13,10,14,10,15,10,16}, mPaint) ; // 7、画线 //mCanvas.drawLine(...) ; // 8、画长方形 Rect 和RectF的区别? //精度不一样,Rect是使用int类型作为数值,RectF是使用float类型作为数值 //Rect r = new Rect(10,10,50,50) ; //mCanvas.drawRect(r, mPaint) ; //RectF rf = new RectF(10,10,50,50) ; //mCanvas.drawRect(rf, mPaint) ; //mCanvas.drawRect(10, 10, 50, 50, mPaint) ; // 9、画椭圆 初始化RectF的参数是(left,top,right,bottom) //RectF rf = new RectF(100,100 ,200 ,250) ; //mCanvas.drawOval(rf, mPaint) ; // 10、画圆 (圆心x0,圆心y0,半径,paint) //mCanvas.drawCircle(100, 100, 50, mPaint) ; // 11、画圆弧 RectF对象表明内切矩形的(left,top,right,bottom) //RectF rf = new RectF(100 ,100 ,200 ,200) ; // 参数(rf,startAngle ,angle ,sweepAngle ,paint) sweepAngle表明是否显示圆弧三角形 angle画多少度 //mCanvas.drawArc(rf, 60, 30, true, mPaint) ; // 12、绘制圆角矩形 RectF是矩形的(left,top,right,bottom) //RectF rf = new RectF(100 ,100 ,200 ,200) ; // 50表明x方向的半径,20表示y方向的半径 //mCanvas.drawRoundRect(rf, 50, 20, mPaint) ; // 13、画任意多边形 //Path path = new Path() ; //path.moveTo(100, 100) ; //path.lineTo(200, 200) ; //path.lineTo(300, 200) ; //mCanvas.drawPath(path, mPaint) ; // 14、通过Path对象,也可以画其他的图形 //Path path = new Path() ; //path.addCircle(100, 100, 20, Path.Direction.CCW) ; //mCanvas.drawPath(path ,mPaint); /*drawBitmap drawText drawPicture*/ /*Rect r = new Rect(100,100,200,200) ; ByteArrayOutputStream out = new ByteArrayOutputStream(); Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ; bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) ; InputStream in = new ByteArrayInputStream(out.toByteArray()) ; */ /*Picture picture = Picture.createFromStream(mContext.getResources().openRawResource(R.raw.bg)) ; mCanvas.drawPicture(picture) ;*/ // 15、画bitmap对象 //mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg),100, 100, mPaint) ; // 16、Matrix中包含了对Bitmap的处理操作 /*Matrix m = new Matrix() ; m.postScale(2, 2) ; m.postRotate(60) ; mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg), m, mPaint) ;*/ // 17、画带Matrix参数的bitmap,经过Matrix对象可以对bitmap做相关的处理,比如旋转,缩放,移动等《关于Matrix的使用另行总结》 /*Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ; Matrix m = new Matrix() ; m.postScale(2, 2) ; m.postRotate(60) ; m.postTranslate(300, 300) ; mCanvas.drawBitmap(bitmap, m, mPaint) ;*/ //mCanvas.drawBitmap(....) ; 暂不总结 // 18、画文字 //mCanvas.drawText(123, 10, 10, mPaint) ; //mCanvas.drawText(....) ;

 

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

        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(3);//画笔的宽度
        paint.setTextSize(50);//设置文本的大小
        /**
         * 第二和第三个参数 代表文字的左下角 在(x,y)轴的坐标
         */
        canvas.drawText("画文字",10,100,paint);

        paint.setUnderlineText(true); // 设置下划线
        canvas.drawText("我是带下划线的",10,200,paint);

        paint.setTextScaleX(2); // 设置文本缩放倍数,1.0f为原始
        canvas.drawText("我是有间距的",200,100,paint);

        /**
         * 参数一是中心点的x轴,参数二是中心点的y轴,参数三是半径,参数四是paint对象;
         */
        paint.setStyle(Paint.Style.STROKE);//空心圆
        paint.setStrokeWidth(3);//画笔的宽度
        canvas.drawCircle(250, 300,100, paint);//

        paint.setStyle(Paint.Style.FILL);//实心
        canvas.drawCircle(250, 300,50, paint);//


        /**
         * 画线 前面两个参数代表xy轴的起点坐标,第三、四为xy轴的终点坐标
         */
        canvas.drawLine(0, 400, 200, 400,paint);//直线
        canvas.drawLine(0, 400, 200, 500, paint);// 斜线

        /**
         * 画弧 参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电弧,
         *      参数二是起始角(度)在电弧的开始,  矩形的中心点开始
                参数三扫描角(度)开始顺时针测量的,
                参数四是如果这是真的话,包括椭圆中心的电弧,并关闭它,如果它是假这将是一个弧线,参数五是Paint对象;
         */
        paint.setStyle(Paint.Style.STROKE);//设置空心
        RectF oval1=new RectF(0,500,180,700);//矩形
        canvas.drawArc(oval1, 0, 180, false, paint);//小弧形
        oval1.set(0,500,150,700);//重新设置矩形范围
        canvas.drawArc(oval1, 0, 360, false, paint);//小弧形

        paint.setStyle(Paint.Style.STROKE);//设置实心(扫过的角度将填满)
        RectF oval12=new RectF(0,800,180,1000);//矩形
        canvas.drawArc(oval12, 0, 180, true, paint);//小弧形
        oval12.set(0,800,150,1000);//重新设置矩形范围
        canvas.drawArc(oval12, 0, 360, true, paint);//小弧形

        /**
         * 画矩形
         */
        paint.setStyle(Paint.Style.STROKE);//设置空心
        canvas.drawRect(200,500,380,700, paint);// 正方形
        canvas.drawRect(200,800,450,1000, paint);// 长方形

        /**
         * 画椭圆
         */
        paint.setStyle(Paint.Style.FILL);//设置实心
        RectF rectF = new RectF(200,800,450,1000);
        canvas.drawOval(rectF,paint);//画椭圆,参数一是扫描区域,参数二为paint对象;


        /**
         * 绘制三角形,你可以绘制任意多边形
         */
        Path path = new Path();
        path.moveTo(80, 200);// 此点为多边形的起点
        path.lineTo(120, 250);
        path.lineTo(80, 350);
        path.close(); // 使这些点构成封闭的多边形
        canvas.drawPath(path, paint);

        paint.setStyle(Paint.Style.STROKE);
        path.moveTo(500, 200);// 此点为多边形的起点
        path.lineTo(600, 450);
        path.lineTo(800, 350);
        //path.close(); 没有封闭
        canvas.drawPath(path, paint);


        /**
         * 画圆角矩形  第二个参数是x半径,第三个参数是y半径
         */
        RectF oval3 = new RectF(500, 600, 800, 1000);// 设置个新的长方形区域
        canvas.drawRoundRect(oval3, 20, 15, paint);


        //画点
        paint.setStyle(Paint.Style.FILL);
        canvas.drawText("画点:", 0, 1600, paint);
        canvas.drawPoint(60, 390, paint);//画一个点
        canvas.drawPoints(new float[]{60,400,65,400,70,400}, paint);//画多个点


        //画贝塞尔曲线
        paint.reset();
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.RED);
        canvas.drawText("画贝塞尔曲线:", 0, 1000, paint);
        Path path2=new Path();
        path2.moveTo(500, 1000);//设置Path的起点
        path2.quadTo(500, 1200, 900, 1500); //设置贝塞尔曲线的控制点坐标和终点坐标
        canvas.drawPath(path2, paint);//画出贝塞尔曲线

    }

 

posted @ 2016-08-04 16:45  ts-android  阅读(1658)  评论(0编辑  收藏  举报