Android Canvas类
1. Canvas类
Canvas
主要用于2D绘图,它提供了很多相应的drawXxx()
方法,Canvas
的获取方式有三种
- 重写
View
的onDraw(Canvas)
方法@Override protected void onDraw(Canvas canvas) {}
SurfaceView
通过lockCanvas()
方法获取Canvas
@Override public void surfaceCreated(SurfaceHolder holder) {Canvas canvas = holder.lockCanvas();holder.unlockCanvasAndPost(canvas); }
- 通过
Canvas(Bitmap)
或setBitmap(Bitmap)
自定义Canvas
Bitmap bitmap = Bitmap.createBitmap(600, 800, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap);
2. 常用方法
绘制背景
// a为透明度,`r`,`g`,`b`代表颜色值
drawARGB(int a, int r, int g, int b)
drawColor(int color)
drawRGB(int r, int g, int b)
绘制点
// 根据给定的坐标,绘制点
drawPoint(float x, float y, Paint)
// 两个一组组成坐标,pts必须是二的倍数
drawPoints(float[] pts, Paint)
// offset是起始,count是数量,必须是二的倍数
drawPoints(float[] pts, int offset, int count, Paint)
绘制线,线由两个点连接而成
// 根据给定的坐标,绘制线
drawLine(float, float, float, float, Paint)
// 四个一组组成连线,pts必须是四的倍数
drawLines(float[] pts, Paint)
// offset是起始,count是数量,必须是四的倍数
drawLines(float[] pts, int offset, int count, Paint)
绘制矩形和圆角矩阵
// 绘制矩形,rect指定左右上下
drawRect(Rect rect, Paint)
drawRect(RectF, Paint)
drawRect(float, float, float, float, Paint)
// 绘制圆角矩形,rx是横向,ry是纵向
drawRoundRect(RectF, float rx, float ry, Paint)
drawRoundRect(float, float, float, float, float, float, Paint)
绘制椭圆
// 绘制椭圆,rect指定左右上下
drawOval(RectF rect, Paint)
drawOval(float, float, float, float, Paint)
绘制圆
// cx和cy是圆的中心,radius是圆的半径
drawCircle(float cx, float cy, float radius, Paint)
绘制弧形
// startAngle是圆弧开始角度,sweepAngle是圆弧经过的角度,useCenter设置圆弧是否经过中心
drawArc(RectF, float startAngle, float sweepAngle, boolean useCenter, Paint)
drawArc(float, float, float, float, float, float, boolean, Paint)
有两种不同Paint
,设置了不同的Color
和Style
mRedPaint = new Paint();
mRedPaint.setColor(Color.RED);
mRedPaint.setStyle(Paint.Style.STROKE);
mRedPaint.setStrokeWidth(5);mBluePaint = new Paint();
mBluePaint.setColor(Color.BLUE);
mBluePaint.setStyle(Paint.Style.FILL_AND_STROKE);
mBluePaint.setStrokeWidth(10);
示例代码
canvas.drawPoint(100, 50, mRedPaint);
float[] pts = new float[]{100, 75, 150, 100, 200, 125};
canvas.drawPoints(pts, mBluePaint);canvas.drawLine(100, 200, 400, 200, mRedPaint);
pts = new float[]{100, 250, 400, 250,400, 250, 250, 450,250, 450, 100, 250};
canvas.drawLines(pts, mBluePaint);canvas.drawRect(100, 500, 300, 600, mRedPaint);
canvas.drawRect(400, 500, 600, 600, mBluePaint);canvas.drawRoundRect(100, 650, 300, 750, 40, 20, mRedPaint);
canvas.drawRoundRect(400, 650, 600, 750, 40, 20, mBluePaint);canvas.drawOval(100, 800, 300, 900, mRedPaint);
canvas.drawOval(400, 800, 600, 900, mBluePaint);canvas.drawCircle(200, 1000, 50, mRedPaint);
canvas.drawCircle(500, 1000, 50, mBluePaint);canvas.drawArc(100, 1100, 300, 1200, 45, 225, false, mRedPaint);
canvas.drawArc(400, 1100, 600, 1200, 45, 225, true, mRedPaint);canvas.drawArc(100, 1250, 300, 1350, 45, 225, false, mBluePaint);
canvas.drawArc(400, 1250, 600, 1350, 45, 225, true, mBluePaint);
效果如下
3. 绘制字符
基础绘制字符方法,y
是基线,详见Android FontMetrics类
// x, y 为起始位置
drawText(String text, float x, float y, Paint)
drawText(String text, int start, int end, float x, float y, Paint)
drawText(CharSequence text, int start, int end, float x, float y, Paint)
drawText(char[] text, int index, int count, float x, float y, Paint)
start
设置为2,end
设置为14,效果如下
设置Paint
可以实现不同的样式,详情可见Android Paint类
沿路径绘制
// hOffset与路径起始点的水平偏移距离,vOffset与路径中心点的垂直偏移量
drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint)
drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint)
Path
是一条斜线,hOffset
为80,vOffset
为20,效果如下
4. save()和restore()方法
save()
方法将当前Canvas
状态进行保存,调用restore()
方法后,会将Canvas
还原成最近的一个save()
的状态。
save()
方法会有一个返回值,可以调用restoreToCount(int saveCount)
方法,将Canvas
还原成某一个特定的save()
状态。
5. clipPath(Path)方法
clipPath(Path)
和clipPath(Path, Region.Op)
方法按所定义的路线剪裁,Region.Op
参数
DIFFERENCE
剪裁出差异的部分INTERSECT
剪裁出相交的部分UNION
剪裁出合并的部分XOR
,与INTERSECT刚好相反REVERSE_DIFFERENCE
,与DIFFERENCE相反REPLACE
,后面覆盖前面
示例代码
private void drawClipPath(Canvas canvas, float dx, float dy, Region.Op op) {canvas.save();canvas.translate(dx, dy);Path path1 = new Path();path1.addCircle(150, 100, 75, Path.Direction.CW);canvas.clipPath(path1);Path path2 = new Path();path2.addCircle(250, 100, 75, Path.Direction.CW);canvas.clipPath(path2, op);canvas.drawColor(Color.RED);canvas.restore();
}
效果如下
6. 位移操作
平移操作
translate(float dx, float dy)
示例代码
canvas.drawRect(rect, mRedPaint);
canvas.translate(50, 50);
canvas.drawRect(rect, mBluePaint);
旋转操作
// 以(0, 0)为原点,旋转
rotate(float degrees)
// 以(px, py)为原点,旋转
rotate(float degrees, float px, float py)
示例代码
canvas.drawRect(rect, mRedPaint);
canvas.rotate(45);
canvas.drawRect(rect, mBluePaint);canvas.rotate(90, 125, 50);
canvas.drawRect(rect, mGreenPaint);
偏离操作
skew(float sx, float sy)
示例代码
canvas.drawRect(rect, mRedPaint);
canvas.skew(1, 0);
canvas.drawRect(rect, mBluePaint);canvas.skew(0, 1);
canvas.drawRect(rect, mGreenPaint);
缩放操作
scale(float sx, float sy)
scale(float sx, float sy, float px, float py)
示例代码
canvas.drawRect(rect, mRedPaint);
canvas.scale(0.5f, 2f);
canvas.drawRect(rect, mBluePaint);
效果如下
相关文章
Android Path类
Android Paint类
Android Canvas类
Android Canvas类相关推荐
- Android Canvas类介绍和Android Draw Rect 坐标图示
当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...
- Android Paint类
1. Paint常用方法 setColor(int),设置画笔的颜色 setAlpha(int),设置画笔的透明度 setARGB(int a, int r, int g, int b),设置画笔的颜 ...
- Android开发--图形图像与动画(一)--Paint和Canvas类
* Paint类 * Paint类代表画笔,用来描述图形的颜色和风格,如线宽,颜色,透明度和填充效果等信息. * 使用Paint类时,需要先创建该类的对象,可以通过该类的构造函数实现.通常情况的实 ...
- Android Canvas总结
0x00 前言 在Android开发中,有时产品需求会要我们实现一个复杂的控件,如果控件不是常用的类型,这时候我们不得不写一个自定义的控件来实现. 自定义一个控件,目前一般通过继承View或者Surf ...
- Android Bundle类 学习总结
Android Bundle类 http://blog.csdn.net/randyjiawenjie/article/details/6651437 根据google官方的文档(http://dev ...
- android Integer类的toString函数的使用
今天,简单讲讲android里如何使用Integer类的toString函数. 这个其实很简单,就是将整数转成字符串.不过之前一直使用的是String.value()来进行转换的.后来在为网上查 ...
- android AtomicBoolean类的使用
今天,简洁讲讲如何使用 AtomicBoolean这个类. 类 在java.util.concurrent.atomic包下,有AtomicBoolean , AtomicInteger, At ...
- android Rect类的使用
今天,讲讲Android的Rect类的使用. public final class Rect extends Object implements Parcelable java.lang.Object ...
- android 画布控件,Android canvas画图操作之切割画布实现方法(clipRect)
本文实例讲述了Android canvas画图操作之切割画布实现方法.分享给大家供大家参考,具体如下: android切割画布的历程不算很难,可是理解起来也比较麻烦,这里写一下我的理解 但是不一定正确 ...
最新文章
- 大数据能力提升项目| 学生成果展系列之二
- 智能医疗战场 人工智能如何赋能健康智能终端?
- ios学习记录 UITextField输入return键监听
- 把struts2的struts.xml配置文件分解成多个配置文件
- 05-01-部署 WSUS on Windows 2019 Core
- 深入浅出让你理解什么是LLVM
- ECshop二次开发 ECSHOP首页显示积分商城里的商品
- 第6次cplus实验
- 谷歌浏览器如何使用网页截图
- 广发银行创新“智慧金融”打造“智慧城市”
- has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present---nginx工作笔记006
- QT + MinGW 中文显示乱码解决方案
- cisco下模拟Linux防火墙,linux下配置cisco防火墙日志服务器
- 转:李开复:打造领导力,我的九点思考
- 推荐一些前端小姐姐的公众号
- 双目立体视觉(3)- ZED2 ROS Melodic 发布RGB图像及深度信息
- -什么样的网站能赚钱
- 科技前沿:几款意念控制器
- java adb命令_从Java程序执行ADB命令
- 11、分布式爬虫(一)