1. Canvas类

Canvas主要用于2D绘图,它提供了很多相应的drawXxx()方法,Canvas的获取方式有三种

  • 重写ViewonDraw(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,设置了不同的ColorStyle

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类相关推荐

  1. Android Canvas类介绍和Android Draw Rect 坐标图示

    当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...

  2. Android Paint类

    1. Paint常用方法 setColor(int),设置画笔的颜色 setAlpha(int),设置画笔的透明度 setARGB(int a, int r, int g, int b),设置画笔的颜 ...

  3. Android开发--图形图像与动画(一)--Paint和Canvas类

    * Paint类  * Paint类代表画笔,用来描述图形的颜色和风格,如线宽,颜色,透明度和填充效果等信息.  * 使用Paint类时,需要先创建该类的对象,可以通过该类的构造函数实现.通常情况的实 ...

  4. Android Canvas总结

    0x00 前言 在Android开发中,有时产品需求会要我们实现一个复杂的控件,如果控件不是常用的类型,这时候我们不得不写一个自定义的控件来实现. 自定义一个控件,目前一般通过继承View或者Surf ...

  5. Android Bundle类 学习总结

    Android Bundle类 http://blog.csdn.net/randyjiawenjie/article/details/6651437 根据google官方的文档(http://dev ...

  6. android Integer类的toString函数的使用

    今天,简单讲讲android里如何使用Integer类的toString函数.  这个其实很简单,就是将整数转成字符串.不过之前一直使用的是String.value()来进行转换的.后来在为网上查 ...

  7. android AtomicBoolean类的使用

    今天,简洁讲讲如何使用  AtomicBoolean这个类. 类 在java.util.concurrent.atomic包下,有AtomicBoolean , AtomicInteger, At ...

  8. android Rect类的使用

    今天,讲讲Android的Rect类的使用. public final class Rect extends Object implements Parcelable java.lang.Object ...

  9. android 画布控件,Android canvas画图操作之切割画布实现方法(clipRect)

    本文实例讲述了Android canvas画图操作之切割画布实现方法.分享给大家供大家参考,具体如下: android切割画布的历程不算很难,可是理解起来也比较麻烦,这里写一下我的理解 但是不一定正确 ...

最新文章

  1. 大数据能力提升项目| 学生成果展系列之二
  2. 智能医疗战场 人工智能如何赋能健康智能终端?
  3. ios学习记录 UITextField输入return键监听
  4. 把struts2的struts.xml配置文件分解成多个配置文件
  5. 05-01-部署 WSUS on Windows 2019 Core
  6. 深入浅出让你理解什么是LLVM
  7. ECshop二次开发 ECSHOP首页显示积分商城里的商品
  8. 第6次cplus实验
  9. 谷歌浏览器如何使用网页截图
  10. 广发银行创新“智慧金融”打造“智慧城市”
  11. has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present---nginx工作笔记006
  12. QT + MinGW 中文显示乱码解决方案
  13. cisco下模拟Linux防火墙,linux下配置cisco防火墙日志服务器
  14. 转:李开复:打造领导力,我的九点思考
  15. 推荐一些前端小姐姐的公众号
  16. 双目立体视觉(3)- ZED2 ROS Melodic 发布RGB图像及深度信息
  17. -什么样的网站能赚钱
  18. 科技前沿:几款意念控制器
  19. java adb命令_从Java程序执行ADB命令
  20. 11、分布式爬虫(一)

热门文章

  1. 项目干系人是什么?如何有效管理项目干系人?
  2. 计算机进制bcd啥意思,bcd码和二进制码有什么区别
  3. 易语言快照和截取屏幕区域
  4. 最新全国区划代码-2022年全国各省五级行政区划代码及名称数据(省-市-区县-乡镇-村)
  5. Power Query M语言表函数Table分类汇总,快速掌握
  6. EKLAVYA -- 利用神经网络推断二进制文件中函数的参数
  7. STM8S103 105唯一序列码的读取
  8. 用友U8不得不说的问题
  9. Excel IF 函数多条件判断
  10. windows无法完成安装,若要在此计算机上安装windows,请重新启动安装