博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android自定义View】绘图之Canvas篇(五)
阅读量:7083 次
发布时间:2019-06-28

本文共 2601 字,大约阅读时间需要 8 分钟。

前言

Canvas就是我们常说的画布,之前说的所有画图操作,都是作用于Canvas之上。

  • 【Android自定义View】绘图之Canvas篇(五)

Canvas主要有以下控制方法,这些方法都是作用于Canvas整体

translate 平移

我们先绘制一个矩形,平移之后,再次绘制

canvas.drawRect(new Rect(500, 500, 1000, 1000), paint);        //平移        canvas.translate(100, 100);        paint.setColor(Color.RED);        canvas.drawRect(new Rect(500, 500, 1000, 1000), paint);复制代码

可以看到,2个矩形并没有重叠

rotate 旋转

还是之前的矩形,为了方便理解,加了2条辅助线

canvas.drawRect(new Rect(500, 500, 1000, 1000), paint);        canvas.drawLine(0, 0, 1000, 1000, paint);        //旋转        canvas.rotate(30);        paint.setColor(Color.RED);        canvas.drawLine(0, 0, 1000, 1000, paint);        canvas.drawRect(new Rect(500, 500, 1000, 1000), paint);复制代码

可以看到,默认的旋转点是(0,0),当然我们也可以指定原点
rotate(float degrees, float px, float py)

for (int i = 0; i < 6; i++) {            canvas.rotate(360 / 6, 500, 1000);            canvas.drawLine(500, 500, 500, 1000, paint);        }复制代码

其实是先平移,在旋转,再平移回去,源码如下

public final void rotate(float degrees, float px, float py) {        if (degrees == 0.0f) return;        translate(px, py);        rotate(degrees);        translate(-px, -py);    }复制代码

scale 缩放

canvas.drawRect(new Rect(500, 500, 1000, 1000), paint);       //缩放        canvas.scale(0.5f, 0.5f);        paint.setColor(Color.RED);        canvas.drawRect(new Rect(500, 500, 1000, 1000), paint);复制代码

skew 斜切

canvas.drawRect(new Rect(500, 500, 1000, 1000), paint);       //缩放        canvas.skew(0, 0.5f);        paint.setColor(Color.RED);        canvas.drawRect(new Rect(500, 500, 1000, 1000), paint);复制代码

clip系列

clipRect(Rect rect) clipRect(RectF rect) clipRect(float left, float top, float right, float bottom) clipPath(Path path)

裁剪之后,canvas其他区域会被裁剪掉,只有区域内画的才可见

canvas.drawRect(new Rect(500, 500, 1000, 1000), paint);        canvas.clipRect(new Rect(500, 500, 600, 600));        canvas.drawColor(Color.RED);        canvas.drawCircle(500, 500, 50, paint);复制代码

save 保存与restore 回复

之前的所有操作对于canvas 都是不可逆的,比如我们做了许多操作之后,希望将canvas的状态保存时,就要用到save。调用save方法时,会保存当前canvas状态,将其放到特定的栈中;调用restore方法时,再从栈中取出。

来看个例子,

canvas.drawRect(new Rect(0, 0, 1000, 1000), paint);        canvas.clipRect(new Rect(100, 100, 900, 900));        canvas.drawColor(Color.RED);        canvas.save();        canvas.clipRect(new Rect(200, 200, 800, 800));        canvas.drawColor(Color.GREEN);        canvas.save();        canvas.clipRect(new Rect(300, 300, 700, 700));        canvas.drawColor(Color.YELLOW);        canvas.save();复制代码

当我们调用2次
restore

canvas.restore();        canvas.restore();        canvas.drawColor(Color.MAGENTA);复制代码

原先绿色部分被填充为紫红色,符合栈后进先出的逻辑。

转载于:https://juejin.im/post/5cf0e367e51d4510a732805f

你可能感兴趣的文章
【梦话区】学习嵌入式需要哪些知识——转
查看>>
Qt添加信号槽
查看>>
vs2008调试 Release 工程
查看>>
dos下进入某一文件
查看>>
热烈庆祝博客园乐进博客正式开通
查看>>
hdu 1247 Hat’s Words(字典树)
查看>>
(转)查看修改oracle数据库字符集
查看>>
Simple way to export SQL Server data to Text Files
查看>>
Visual Studio 2012中使用自定义project properties
查看>>
引用 MySQL集群:主从数据库配置 实现查询负载
查看>>
选中复选框
查看>>
Asp.net web Api源码分析-HttpRequestMessage的创建
查看>>
Asp.net web Api源码分析-HttpActionDescriptor的创建
查看>>
免费图标字体:一套圣诞节相关的图标字体
查看>>
让datagridview默认选中一行,系统默认的是选中第一行的第一个单元格
查看>>
php创建多级目录的函数
查看>>
ASP.NET 服务器控件对应HTML标签
查看>>
C++中int 转换成 string类型
查看>>
汽车库通风防排烟设计规范
查看>>
iOS网络编程-ASIHTTPRequest异步请求
查看>>