Android之Canvas画笔和画布

久违的Canvas画布,终于学到这里了,学完以后附上博文一篇以便日后记不住。

目录

一、Canvas(画布)

二、Paint(画笔)

三、实例

    涉及的相关知识点

            1、绘制安卓机器人

            2.绘制文本 

           3.绘制图片

           4.绘制路径:


首先我觉得最难易懂大的一点是Canvas里面的四个坐标点(loat left, float top, float right, float bottom, Paint paint)

 

一、Canvas(画布)

帆布类的“画”。画一些东西,你需要四个基本组成部分:位图的像素,帆布画的调用(写位图),绘图原语(如矩形、路径、文本、位图),和一个油漆(描述的颜色和款式图)。

二、Paint(画笔)

下面我将以一些实例来了解画笔和画布。

三、实例

首先每一个案例都要做到的步骤:

创建一个Java类继承View,重写onDraw方法,布局文件要设置成FrameLayout布局

在onDraw方法里编写代码:

public class MyView extends View {
public MyView(Context context) {
super(context);

}

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

在MainActivity.java文件里对布局文件实例化, 添加自定义View:

public class MainActivity extends Activity {
private FrameLayout root;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

root=findViewById(R.id.root);
root.addView(new MyView(this));
}
}

    涉及的相关知识点:

            

  Canvas相关方法:

       

drawArc(float left, float top, float right, float bottom,

  boolean useCenter, Paint paint)

--------->绘制指定的弧,将缩放以适合在指定的椭圆形。

        drawText("字符串",float right, float bottom, Paint paint);-------------->绘制文本

         drawRect(float left, float top, float right, float bottom, Paint paint)----------->绘制矩形

         drawLine(float left, float top, float right, float bottom, Paint paint)----------->画一条线段与指定的启动和停止x,y坐标,使用指定的油漆。

        drawRoundRect( float left, float top, float right, float bottom, float rx,float ry, Paint paint)------------->使用指定的油漆画指定的圆角。

        drawCircle( float cx, float cy, float radius, Paint paint)------------->使用指定的油漆画指定的圆

          

drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)

绘制位图

Paint相关方法:

        setAntiAlias(boolean)------->抗锯齿平滑的边缘

        setColor(16进制颜色编码)--------->设置颜色

        setStrokeWidth(数值);----------->设置宽度笔触

        setTextAlign(Paint.Align.LEFT);--------->设置文字水平左对齐

        setTextSize(30);------------设置文字大小

        

RectF方法:

            RectF拥有四个浮动坐标矩形。矩形的坐标表示的4边(左,上,右底部)。可以直接访问这些字段。使用宽度()和高度()来检索矩形的宽度和高度。注意:大多数方法不检查坐标排序正确(即左< =右和上< =下)。

             RectF(float left, float top, float right, float bottom)------------->创建一个新的矩形与指定的坐标

             offset(float dx, float dy) ------------->抵消矩形通过添加dx左和右坐标,并添加dy顶部和底部坐标

    1、绘制安卓机器人

Java类继承View文件:

package com.example.a13468.mydemo20_canvas_01;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;

/**利用Canvas绘制安卓机器人
 * Created by 13468 on 2018/11/29.
 */

public class MyView extends View {
    public MyView(Context context) {
        super(context);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        /**
         * 设置画笔
         */
        Paint paint=new Paint();//定义一个默认的画笔
        paint.setColor(0xFFA4C739);//设置画笔颜色
        paint.setStyle(Paint.Style.FILL);//设置填充方式


        //绘制机器人的头
        RectF rectF=new RectF(250,250,700,700);//定义外轮廓矩形
        rectF.offset(90,20);
        canvas.drawArc(rectF,-10,-160,false,paint);//绘制弧

        //绘制眼睛
        paint.setColor(0xFFFFFFFF);//设置为白色
        canvas.drawCircle(450,380,20,paint);//左眼
        canvas.drawCircle(670,380,20,paint);


        //绘制天线
        paint.setColor(0xFFA4C739);//设置画笔颜色
        paint.setStrokeWidth(10);
        canvas.drawLine(450,300,325,150,paint);//绘制线
        canvas.drawLine(680,300,800,150,paint);//绘制线

        //绘制身体
        canvas.drawRect(350,500,775,800,paint);//绘制矩形
        RectF rectF_body=new RectF(350,600,775,1000);
        canvas.drawRoundRect(rectF_body,50,50,paint);//绘制圆形矩角


        //绘制胳膊
        RectF rectF_arm=new RectF(200,600,300,900);
        canvas.drawRoundRect(rectF_arm,50,50,paint);//绘制圆角矩形
        rectF_arm.offset(625,0);
        canvas.drawRoundRect(rectF_arm,50,50,paint);//绘制圆形矩角


        //绘制腿
        RectF rectF_leg=new RectF(400,900,450,1200);
        canvas.drawRoundRect(rectF_leg,50,50,paint);//绘制圆角矩形
        rectF_leg.offset(275,0);
        canvas.drawRoundRect(rectF_leg,50,50,paint);//绘制圆形矩角



    }
}

2.绘制文本 

Java类继承View文件:

package com.example.a13468.mydemo21_canvas_02;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;

/**利用画布绘制文本信息
 * Created by 13468 on 2018/11/30.
 */

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

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

        //创建默认画笔
        Paint paint=new Paint();
        paint.setColor(0xFF000000);//设置画笔颜色为黑色
        paint.setAntiAlias(true);//抗锯齿平滑的边缘
        paint.setTextAlign(Paint.Align.LEFT);//设置文字水平左对齐
        paint.setTextSize(30);//设置文字大小

        canvas.drawText("你好我是杰克",170,440,paint);//绘制文字
        canvas.drawText("我是一名程序员",160,470,paint);//绘制文字


        canvas.drawText("哇!我好喜欢你",700,450,paint);//绘制文字

    }
}

3.绘制图片

Java类继承View文件:

package com.example.a13468.mydemo22_canvas_03;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Environment;
import android.view.View;

/**利用BitmapFactory类读取SD卡的图片用Bitmap类选取图片区域绘制图片
 * Created by 13468 on 2018/11/30.
 */

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

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint=new Paint();//创建画笔
        String path= Environment.getExternalStorageDirectory()+"/logo.jpg";//读取图片路径
        Bitmap bitmap=BitmapFactory.decodeFile(path);//创建位图对象
        //绘制图片
        canvas.drawBitmap(bitmap,0,0,paint);//绘制图片

        //挖取一小块图片
        Bitmap bitmap1=Bitmap.createBitmap(bitmap,100,20,500,600);//新的位图图象
        canvas.drawBitmap(bitmap1,500,900,paint);
    }
}

 4.绘制路径:

         Path path= new Path();

 绘制圆形路径

path.addCircle(250,150,100,Path.Direction.CCW);参数1:x坐标 参数2:y坐标 参数3:圆的半径 参数4:路径样式(此逆时针)

 canvas.drawPath(path,paint);//绘制路径

 Java类继承View文件:

package com.example.a13468.mydemo23_canvas_04;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;

/**
 * Created by 13468 on 2018/11/30.
 */

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

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

        //创建画笔
        Paint paint=new Paint();
        paint.setAntiAlias(true);//设置抗锯齿功能
        paint.setColor(0xFF0000FF);//设置颜色
        paint.setStyle(Paint.Style.STROKE);//设置样式为描边


        //创建路径
        Path path= new Path();
        path.addCircle(350,450,200,Path.Direction.CCW);

       // canvas.drawPath(path,paint);//绘制路径

        paint.setTextSize(100);
        canvas.drawTextOnPath("活着就是为了改变世界",path,0,0,paint);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42370957/article/details/84677623