Android 绘制——Canvas与Paint使用探索(一)——基础知识
1. Canvas与Paint
与绘图一样,Paint即笔,Canvas即画布。绘图过程中,大小、粗细、岩壁颜色、透明度、字体样式等在Paint中设置,画出成品的东西,例如圆形,矩形,文字相关的在Canvas中生成。
自定义绘制的**基本步骤**:创建Paint对象,重写onDraw(),把绘制代码写在onDraw()里面
1.1 基本函数设置
首先对于Paint来说,其API主要可以分为4类:
- 颜色
- 效果
- drawText()相关
- 初始化
这里先给出期常见的的几个函数:
- paint.setAntiAlias(true);//抗锯齿功能
- paint.setColor(Color.RED); //设置画笔颜色
- paint.setStyle(Style.FILL);//设置填充样式,画线模式
- paint.setStrokeWidth(30);//设置画笔宽度
- paint.setShadowLayer(10,15,15,Color.GREEN);设置阴影
开启抗锯齿功能还可以在创建Paint对象时加上ANTI_ALIAS_FLAG参数
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
这里解释一下抗锯齿,抗锯齿就是使得图形更加圆滑一些,不过添加抗锯齿功能在某些角度上来说也造成了图形颜色失真。
- void setStyle(Paint.Style style)设置填充样式
Paint.Style.FILL :填充内部 Paint.Style.FILL_AND_STROKE :填充内部和描边
Paint.Style.STROKE :仅描边(勾边模式)
从效果上来说,FILL与FILL_AND_STROKE没什么区别。
- setShadowLayer(float radius, float dx, float dy, int color)` 添加阴影
radius:阴影的倾斜度
dx:水平位移
dy:垂直位移
paint.setShadowLayer(10, 15, 15, Color.GREEN);//设置阴影
对于Canvas来说,其API主要可以分为两大类:
- 文字和几何绘制
- 几何变换
基础简单函数如:
画布背景设置:
- canvas.drawColor(Color.BLUE);
- canvas.drawRGB(255, 255, 0); //这两个功能一样,都是用来设置背景颜色的
- canvas.drawARGB(int a, int r, int g, int b); //用于绘制之后为界面设置半透明蒙版
1.2 引导示例
实践出真知,在具体展开前,先做一个简单的引导示例,对Paint和Canvas的使用有一个直观的认识和了解。
- activity.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > </FrameLayout>
- MyView.java
public class MyView extends View { private Context mContext; private Paint mPaint = new Paint(); public MyView(Context context) { super(context); // TODO Auto-generated constructor stub mContext = context; init(); } //重写OnDraw()函数,在每次重绘时自主实现绘图 @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); canvas.drawRGB(255, 255, 255); //画圆 canvas.drawCircle(190, 200, 150, mPaint); } private void init() { //设置画笔基本属性 mPaint.setAntiAlias(true);//抗锯齿功能 mPaint.setColor(Color.RED); //设置画笔颜色 mPaint.setStyle(Paint.Style.STROKE);//设置填充样式 Style.FILL/Style.FILL_AND_STROKE/Style.STROKE mPaint.setStrokeWidth(5);//设置画笔宽度 mPaint.setShadowLayer(10, 15, 15, Color.GREEN);//设置阴影 //设置画布背景颜色 } }
- MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout root=(FrameLayout)findViewById(R.id.root); root.addView(new MyView(MainActivity.this)); } }
效果:
2. Cavas几何绘制
前述说到Cavas只要分为文字与几何绘制、几何变换这两大类,现在先介绍一个第一个大类中的几何绘制
2.1 直线 drawLine(s)
- 方法一:绘制一条直线
drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
其中前面四个参数就是直线的起点与终点的坐标,最后一个参数时画笔对象,设置线条颜色,样式,粗细等。
例如:
Paint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth(5);//设置画笔宽度 canvas.drawLine(100, 100, 200, 200, paint);
- 方法二:绘制多条直线
void drawLines (float[] pts, Paint paint) void drawLines (float[] pts, int offset, int count, Paint paint)
这两个方法都是绘制多条直线,其中:
- pts 是点坐标的集合
- offset 这个参数表示跳过的数据个数,这些数据不参与绘制过程(必须是4的倍数)
- count 实际参与绘制的个数(必须是2的倍数,不少于2)
- paint 绘制直线使用的画笔
例如:
float []mPts = new float[]{0,100,200,300, 0,200,200,400}; canvas.drawLines(mPts,mPaint); //或者 //canvas.drawLines(mPts,4,4,paint); //跳过前面四个数据
2.2 点 drawPoint(s)
- 方法一:单个点
void drawPoint (float x, float y, Paint paint)
其中前两个参数是点坐标参数
示例:
canvas.drawPoint(100, 100, paint)
- 方法二:多个点
void drawPoints (float[] pts, Paint paint) void drawPoints (float[] pts, int offset, int count, Paint paint)
这两个方法的使用方法与绘制多条直线类似,可以参考一下
2.3 矩形工具Rect 与RectF
这两个都是矩形辅助类,区别不大,用哪个都行,根据四个点构建一个矩形结构;在画图时,利用这个矩形结构可以画出对应的矩形或者与其它图形Region相交、相加等等
二者的区别在于精度,Rect参数是int型,RectF是Float型。
关于RectF,构造函数有以下四个,但是最常用的还是以下第二个:
RectF() RectF(float left, float top, float right, float bottom) RectF(RectF r) RectF(Rect r)
对于Rect,其构造函数如下:
Rect() `Rect(int left, int top, int right, int bottom)` Rect(Rect r)
了解了矩形的两个辅助类,这里了解如何绘制矩形:
//确定矩形四个顶点的位置配上画笔即可 void drawRect(float left, float top, float right, float bottom, Paint paint) // 矩形的四个位置为整型时使用 void drawRect(Rect r, Paint paint) //矩形四个位置为浮点型使用 void drawRect(RectF r, Paint paint)
例如:
canvas.drawRect(10, 10, 100, 100, paint);//直接构造 RectF rect = new RectF(120, 10, 210, 100); canvas.drawRect(rect, paint);//使用RectF构造 Rect rect2 = new Rect(230, 10, 320, 100); canvas.drawRect(rect2, paint);//使用Rect构
2.4 圆角矩形 drawRoundRect()
- 方法一:
void drawRoundRect (RectF rect, float rx, float ry, Paint paint)
参数:
RectF** rect:要画的矩形
float rx:生成圆角的椭圆的X轴半径
float ry:生成圆角的椭圆的Y轴半径
示例:
private RectF mRectF = new RectF(20,20,120,120); canvas.drawRoundRect(mRectF,20,20,mPaint);
方法二:
drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)
该方法的使用与方法一类似
2.5 圆形 draw.circle()
void drawRoundRect (RectF rect, float rx, float ry, Paint paint)
参数:
float cx:圆心点X轴坐标
float cy:圆心点Y轴坐标
float radius:圆的半径
注意:当画笔设置了
StrokeWidth时,圆的半径=内圆的半径+
StrokeWidth/2
2.6 椭圆 drawOval()
方法:
void drawOval (RectF oval, Paint paint)
参数:
RectF oval:用来生成椭圆的矩形
除了这个方法,还可以通过
drawOval(float left, float top, float right, float bottom, Paint paint)绘制椭圆。
2.7 弧 drawArc()
弧是椭圆的一部分,而椭圆是根据矩形来生成的,所以弧当然也是根据矩形来生成的
方法:
drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint) drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
画的方向是顺时针
- userCenter 若为true表示此弧会和 RectF 中心相连形成扇形,否则,弧的两头直接相连形成图形。
- startAngle,负数或大于360则对360模除。
- sweepAngle,大于360,则画出一圈。
- 角度:以 RectF 中心为坐标中心,中心所在直线为水平线,负角度弧斜上走,正角度弧斜下走,或者说以时钟三点钟为0度,顺时针为正,逆时针为负。
例如:
mPaint.setAntiAlias(true); mPaint.setColor(Color.RED); RectF mRecF=new RectF(20,20,200,200); canvas.drawArc(mRecF,-45,135,true,mPaint);//以斜上45度为起点,顺时针扫过135度
useCenter=true
useCenter=false
2.8 图片 drawBitmap
待补充(不知道为什么,使用该方法程序突然崩溃,还没有log。。。)
2.9 背景颜色
方法:
drawColor(int color, PorterDuff.Mode mode)
画整个画布的背景,但若区域受到剪裁,则只绘制剪裁区域的背景. 关键类
PorterDuff.Mode,这个类在后面会详细介绍到
方法:
drawRGB(int r, int g, int b) drawARGB(int a, int r, int g, int b);
使用方法与前面类似,这里的第二种方法可以设置透明度,一般用来绘制一层蒙层。
- Android使用Canvas绘制2D图形基础
- Android绘图基础:Canvas、Paint、Path的简单使用
- Android基础知识(9)—Android绘图基础Canvas、Paint
- Android绘图基础:Canvas、Paint等的使用
- android游戏开发中图形绘制:Canvas和Paint的使用
- android中使用Canvas绘制指定位置和宽高度的图片
- Android基础知识之String类使用详解
- Java基础知识强化之网络编程笔记16:Android网络通信之 使用Http的Get方式读取网络数据(基于HTTP通信技术)
- 初学Android,图形图像之使用Canvas,Paint绘图(二十五)
- Android:使用canvas绘制饼状统计图(自动适应条目数量/大小)
- Android中canvas和paint的关系及使用
- Android自定义View(Paint和Canvas的基本使用)
- Android基础知识之String类使用详解
- Android隐喻(三) 图形绘制: Canvas、SurfaceView、Paint、Surface、SurfaceHolder、Bitmap
- android中Canvas使用drawBitmap绘制图片
- Android绘图基础Paint和Canvas介绍-android学习之旅(六十一)
- android canvas paint绘制相关图形
- Android中使用SurfaceView和Canvas来绘制动画
- 【Android基础知识】选项菜单、上下文菜单、子菜单的使用
- Android控件使用—Fragment的基础知识