久违的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);
}
}