Android Canvas

一、Canvas介绍

Canvas(画布):Canvas是Android提供的一个2D绘图API,它允许我们在屏幕上绘制图形、文字、图像等。通过Canvas,我们可以实现自定义的UI界面,绘制各种形状、颜色和纹理等。Canvas提供了一系列的绘制方法,如绘制线条、矩形、圆形、椭圆等,还可以进行图像的平移、旋转、缩放等操作。

Canvas 支持“绘制”调用,想要进行绘制,你需要4个基本组成:一个由像素构成的位图,支持绘制调用的画布(绘制位图),一个图元(如矩形,路径,文本,位图),和油漆(用于绘制图的颜色和样式)。而我们最常用的就是在一个View上画一些图片,形状或者自定义的文本内容,这里我们都是使用Canvas来实现的!你可以获取View中的Canvas 对象,在onDraw(Canvas canvas) 提供了canvas 对象。

我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。

这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图。

Android中的Drawable和Canvas是用于绘制图形和图像的两个重要概念,我们容易对它们进行混淆:

Drawable是一个可绘制的对象,它可以是一个图形、一个位图或者是一个颜色。Drawable可以用来绘制在View上,它可以是背景、前景或者是View的内容,Drawable具有位置和大小、透明度等,Drawable的位置及大小也会收到它的承载器,如:View的影响。

Canvas是一个绘图的画布,它提供了一系列的绘制方法,可以在其上绘制各种图形、文本和位图。通过Canvas,我们可以实现自定义的绘图效果。Drawable中包含Canvas。可以通过将Canvas作为参数传递给Drawable的draw方法,将Drawable绘制到Canvas上。

二、Canvas相关类

JAVA类

BaseCanvas

此类是 Canvas 绘图操作的基类。

BaseCanvas 文件路径:

frameworks/base/graphics/java/android/graphic/BaseCanvas.java

BaseCanvas 定义:

public abstract class BaseCanvas {}

Canvas

Android中的Canvas是一个用于绘制图形和文本的2D画布。它提供了一系列的绘制方法,可以在View上绘制各种形状、图像和文本。

Canvas文件路径:

frameworks/base/graphics/java/android/graphic/Canvas.java

Canvas定义:

public class Canvas extends BaseCanvas {}

下面是Canvas类常用的方法:

Canvas():构建一个空的栅格画布。
Canvas(Bitmap bitmap):构造一个具有指定位图的画布进行绘制。
boolean clipPath(Path path, Region.Op op):使用指定的路径修改当前剪辑。
boolean clipPath(Path path):将当前剪辑与指定路径相交。
boolean clipRect(float left, float top, float right, float bottom, Region.Op op):使用指定的矩形修改当前剪辑,该矩形以局部坐标表示。
boolean clipRect(RectF rect):将当前剪辑与指定的矩形相交,该矩形以局部坐标表示。
boolean clipRect(Rect rect, Region.Op op):使用指定的矩形修改当前剪辑,该矩形以局部坐标表示。
boolean clipRect(int left, int top, int right, int bottom):将当前剪辑与指定的矩形相交,该矩形以局部坐标表示。
boolean clipRect(float left, float top, float right, float bottom):将当前剪辑与指定的矩形相交,该矩形以局部坐标表示。
boolean clipRect(RectF rect, Region.Op op):使用指定的矩形修改当前剪辑。
boolean clipRect(Rect rect):将当前剪辑与指定的矩形相交,该矩形以局部坐标表示。
void concat(Matrix matrix):用指定的矩阵预处理当前矩阵。
void drawRect(RectF rect, Paint paint):绘制区域,参数一为RectF一个区域
void drawPath(Path path, Paint paint):绘制一个路径,参数一为Path路径对象
void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint):贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(这里是bitmap),参数三是目标区域(应该在canvas的位置和大小),参数四是Paint画刷对象,因为用到了缩放和拉伸的可能,当原始Rect不等于目标Rect时性能将会有大幅损失。
void drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint):通过网格绘制位图,其中网格顶点均匀分布在位图中。
void drawLine(float startX, float startY, float stopX, float stopY, Paintpaint):画线,参数一起始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置,参数四y轴垂直位置,最后一个参数为Paint 画刷对象。
void drawLines(float[] pts, int offset, int count, Paint paint):画一系列线条。
void drawPoint(float x, float y, Paint paint):画点,参数一水平x轴,参数二垂直y轴,第三个参数为Paint对象。
void drawPoints(float[] pts, Paint paint):用于drawPoints()的助手,假定您要绘制整个数组。
void drawText(String text, float x, floaty, Paint paint):渲染文本,Canvas类除了上面的还可以描绘文字,参数一是String类型的文本,参数二x轴,参数三y轴,参数四是Paint对象。
void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint):沿着指定的路径使用指定的绘图绘制文本,原点位于(x,y)处。
void drawOval(RectF oval, Paint paint):画椭圆,参数一是扫描区域,参数二为paint对象;
void drawCircle(float cx, float cy, float radius,Paint paint):绘制圆,参数一是中心点的x轴,参数二是中心点的y轴,参数三是半径,参数四是paint对象;
void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint):画弧,参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电弧,参数二是起始角(度)在电弧的开始,参数三扫描角(度)开始顺时针测量的,参数四是如果这是真的话,包括椭圆中心的电弧,并关闭它,如果它是假这将是一个弧线,参数五是Paint对象;
void drawRGB(int r, int g, int b):使用srcover porterduff模式,用指定的RGB颜色填充整个画布的位图(仅限于当前剪辑)。
void drawRect(float left, float top, float right, float bottom, Paint paint):使用指定的绘图绘制指定的Rect。
void drawRoundRect(RectF rect, float rx, float ry, Paint paint):使用指定的绘图绘制指定的圆角。
void drawARGB(int a, int r, int g, int b):使用srcover porterduff模式,用指定的ARGB颜色填充整个画布的位图(仅限于当前剪辑)。
void drawColor(int color):使用srcover porterduff模式,用指定的颜色填充整个画布的位图(限制为当前剪辑)。
void drawPicture(Picture picture, Rect dst):绘制图片,拉伸以适合dst矩形。
void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount, float x, float y, boolean isRtl, Paint paint):在单一方向上绘制一段文本,并带有用于复杂文本整形的可选上下文。
void drawVertices(Canvas.VertexMode mode, int vertexCount, float[] verts, int vertOffset, float[] texs, int texOffset, int[] colors, int colorOffset, short[] indices, int indexOffset, int indexCount, Paint paint):绘制顶点数组,解释为三角形(基于模式)。
boolean getClipBounds(Rect bounds):返回bounds参数中当前剪辑的边界(以本地坐标表示),如果非空,则返回true。
final Rect getClipBounds():检索当前剪辑的边界(以本地坐标)。
int getDensity():返回画布的目标密度。
int getHeight():返回当前绘图图层的高度。
int getMaximumBitmapHeight():返回使用此画布绘制的位图的最大允许高度。
int getMaximumBitmapWidth():返回使用此画布绘制的位图的最大允许宽度。
int getSaveCount():返回Canvas专用堆栈上矩阵/剪辑状态的数量。
int getWidth():返回当前绘图图层的宽度。
void restore():此调用将先前调用save(),并用于从上次保存调用后删除对矩阵/剪辑状态的所有修改。
void restoreToCount(int saveCount):Canvas的restoreToCount方法的作用是将画布状态栈出栈到指定的层级。通过调用该方法,可以将画布状态恢复到指定层级之前的状态。
final void rotate(float degrees, float px, float py):用指定的旋转预先缩放当前矩阵。
int save():Canvas的save方法用于保存当前画布的状态,包括当前的变换矩阵、剪裁区域和画笔设置等。保存的状态可以通过Canvas的restore方法进行恢复,恢复后可以继续在之前保存的状态下进行绘制操作。
int saveLayer(float left, float top, float right, float bottom, Paint paint):Canvas的saveLayer方法可以创建一个新的透明图层,并将saveLayer之前的一些Canvas操作延续到新建的图层上。
int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, int saveFlags):saveLayerAlpha()的帮助器,取4个值而不是RectF。
final void scale(float sx, float sy, float px, float py):用指定的比例预先缩放当前矩阵。
void setBitmap(Bitmap bitmap):指定要绘制的画布的位图。
void setDensity(int density):指定此Canvas的支持位图的密度。
void setMatrix(Matrix matrix):用指定的矩阵完全替换当前矩阵。
void skew(float sx, float sy):用指定的偏斜对当前矩阵进行预先扫描。
void translate(float dx, float dy):用指定的转换对当前矩阵进行预处理。

Paint

Paint是Android中用于绘制图形和文本的类。它提供了一系列方法和属性,用于设置画笔的样式、颜色、宽度等。

Paint文件路径:

frameworks/base/graphics/java/android/graphic/Paint.java

Paint定义:

public class Paint {}

Paint方法:

Paint():用默认设置创建一个新的绘图。
Paint(int flags):用指定的标志创建一个新的绘画。
Paint(Paint paint):创建一个新的绘图,使用指定的绘图参数中的属性进行初始化。
void reset():将绘图恢复到其默认设置。
void set(Paint src):将来自src的字段复制到此画图中。
void setARGB(int a, int r, int g, int b):使用a,r,g,b和构造颜色int
void setAlpha(int a):只分配颜色的alpha值,保持其r,g,b值不变。
void setColor(int color):设置油漆的颜色。
ColorFilter setColorFilter(ColorFilter filter):设置或清除涂料的颜色过滤器,返回参数。
void setFlags(int flags):设置油漆的标志。
void setFontFeatureSettings(String settings):设置字体功能设置。
void setLetterSpacing(float letterSpacing):为文本设置油漆的字母间距。
Shader setShader(Shader shader):设置或清除着色器对象。
void setShadowLayer(float radius, float dx, float dy, int shadowColor):这会在主图层下绘制一个阴影图层,具有指定的偏移和颜色以及模糊半径。
void setStrokeMiter(float miter):设置涂料的笔触斜角值。
void setTextAlign(Paint.Align align):设置涂料的文字对齐。
void setTextSize(float textSize):设置颜料的文字大小。
void setTextSkewX(float skewX):为文字设置涂料的水平偏斜系数。
void setDither(boolean dither):设置或清除DITHER_FLAG位抖动会影响比设备更高精度的颜色如何下采样。

Rect

Rect是一个用于表示矩形的类。它可以用来指定矩形的位置和大小。

Rect文件路径:

frameworks/base/graphics/java/android/graphic/Rect.java

Rect定义:

public final class Rect implements Parcelable {}
Rect方法:
Rect():创建一个新的空Rect。
Rect(int left, int top, int right, int bottom):用指定的坐标创建一个新的矩形。
Rect(Rect r):创建一个新的矩形,使用指定矩形中的值进行初始化(未作任何修改)。
void inset(int dx, int dy):插入矩形。
void set(int left, int top, int right, int bottom):将矩形的坐标设置为指定的值。
void set(Rect src):将来自src的坐标复制到此矩形中。
void union(int left, int top, int right, int bottom):更新此Rect以包围自身和指定的矩形。

RectF

RectF是一个包含矩形四个单精度浮点坐标的类。通过上下左右四个边的坐标来表示一个矩形。

RectF文件路径:

frameworks/base/graphics/java/android/graphic/RectF.java

RectF定义:

public class RectF implements Parcelable {}

Path

Path是一个用于管理文件和目录路径的模块。它提供了一些方法来操作路径,例如连接路径、获取文件名和目录名等。

Path文件路径:

frameworks/base/graphics/java/android/graphic/Path.java

Path定义:

public class Path {}

Matrix

用于图形特效处理的,颜色矩阵(ColorMatrix),还有使用Matrix进行图像的 平移,缩放,旋转,倾斜等。

Matrix文件路径:

frameworks/base/graphics/java/android/graphic/Matrix.java

Matrix定义:

public class Matrix {}

ColorFilter

ColorFilter是Android中用于处理颜色的类。它有三个主要的子类:ColorMatrixColorFilter、LightingColorFilter和PorterDuffColorFilter。

ColorFilter文件路径:

frameworks/base/graphics/java/android/graphic/ColorFilter.java

ColorFilter定义:

public class ColorFilter {}

Picture

A Picture records drawing calls (via the canvas returned by beginRecording) and can then play them back into Canvas (via {@link Picture#draw(Canvas)} or {@link Canvas#drawPicture(Picture)}).

Picture 记录绘图调用(通过 beginRecording 返回的画布),然后可以将它们播放回 Canvas(通过 {@link Picture#draw(Canvas)} 或 {@link Canvas#drawPicture(Picture)})。

Picture文件路径:

frameworks/base/graphics/java/android/graphic/Picture.java

Picture定义:

public class Picture {}

C++类

Canvas

Canvas文件路径:

frameworks/base/libs/hwui/Canvas.cpp

frameworks/base/libs/hwui/Canvas.h

Canvas定义:

class ANDROID_API Canvas {}

三、Canvas相关流程介绍

Canvas save流程分析

Android13 Canvas save流程分析-CSDN博客

Canvas saveLayer流程分析

Android13 Canvas saveLayer流程分析-CSDN博客

Canvas drawPath流程分析

Android13 Canvas drawPath流程分析-CSDN博客

Canvas drawRect流程分析

Android13 Canvas clipRect流程分析-CSDN博客

Canvas drawOval流程分析

Android Canvas drawOval流程分析-CSDN博客

Canvas drawLine流程分析

Android13 Canvas drawLine流程分析-CSDN博客

Canvas drawRoundRect流程分析

Android13 Canvas drawRoundRect流程分析-CSDN博客

Canvas drawImage流程分析

Android13 Canvas drawImage流程分析-CSDN博客

Canvas drawText流程分析

Android13 Canvas drawText流程分析-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值