Android中的canvas介绍(1)

本文详细解释了AndroidCanvas的基本操作,包括Bitmap和Canvas的创建,Canvas可以绘制的内容如填充、几何图形、图片、文本等,以及Canvas的保存和回滚功能,特别是图层(saveLayer)的使用,展示了如何通过图层管理复杂绘图操作。
摘要由CSDN通过智能技术生成
  1. Bitmap b = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888);

  2. Canvas c = new Canvas(b);

  3. /*先new一个Canvas对象,在调用setBitmap方法,一样的效果

  4. * Canvas c = new Canvas();

  5. * c.setBitmap(b);

  6. */

第三种方式,是调用SurfaceHolder.lockCanvas(),返回一个Canvas对象。

2、canvas可以绘制的内容

1)填充

drawARGB(int a, int r, int g, int b)

drawColor(int color)

drawRGB(int r, int g, int b)

drawColor(int color, PorterDuff.Mode mode)

2)几何图形

canvas.drawArc (扇形)

canvas.drawCircle(圆)

canvas.drawOval(椭圆)

canvas.drawLine(线)

canvas.drawPoint(点)

canvas.drawRect(矩形)

canvas.drawRoundRect(圆角矩形)

canvas.drawVertices(顶点)

cnavas.drawPath(路径)

3)图片

canvas.drawBitmap (位图)

canvas.drawPicture (图片)

4)文本

canvas.drawText

3. Canvas的保存和回滚

为了方便一些转换操作,Canvas还提供了保存和回滚属性的方法(save和restore),比如你可以先保存目前画纸的位置(save),然后旋转90度,向下移动100像素后画一些图形,画完后调用restore方法返回到刚才保存的位置。

Canvas提供的该功能的API如下:

[java]  view plain copy

  1. /**

  2. * 保存当前的matrix和clip到私有的栈中(Skia内部实现)。任何matrix变换和clip操作都会在调用restore的时候还原。

  3. * @return 返回值可以传入到restoreToCount()方法,以返回到某个save状态之前。

  4. */

  5. public native int save();

  6. /**

  7. * 传入一个标志,来表示当restore 的时候,哪些参数需要还原。该参数定义在Canvas中,参照下面。

  8. * save()方法默认的是还原matrix和clip,但是可以使用这个方法指定哪些需要还原。并且只有指定matrix和clip才有效,其余的几个参数是

  9. * 用于saveLayer()和saveLayerAlpha()方法 的。

  10. */

  11. public native int save(int saveFlags);

  12. /**

  13. * 回到上一个save调用之前的状态,如果restore调用的次数大于save方法,会出错。

  14. */

  15. public native void restore();

  16. /**

  17. * 返回栈中保存的状态,值等译 save()调用次数-restore()调用次数

  18. */

  19. public native int getSaveCount();

  20. /**

  21. * 回到任何一个save()方法调用之前的状态

  22. */

  23. public native void restoreToCount(int saveCount);

  24. /**saveFlags的参数*/

  25. public static final int MATRIX_SAVE_FLAG = 0x01;//需要还原Matrix

  26. public static final int CLIP_SAVE_FLAG = 0x02;//需要还原Clip

  27. /**下面三个参数在saveLayer的时候使用,具体作用,没有搞明白*/

  28. public static final int HAS_ALPHA_LAYER_SAVE_FLAG = 0x04;

  29. public static final int FULL_COLOR_LAYER_SAVE_FLAG = 0x08;

  30. public static final int CLIP_TO_LAYER_SAVE_FLAG = 0x10;

  31. public static final int ALL_SAVE_FLAG = 0x1F; //还原所有

  32. /*关于saveLayer的具体flags还不大明白它的含义,具体怎么使用在下面例子中*/

  33. public int saveLayer(RectF bounds, Paint paint, int saveFlags)

  34. public int saveLayer(float left, float top, float right, float bottom,

  35. Paint paint, int saveFlags)

  36. public int saveLayerAlpha(RectF bounds, int alpha, int saveFlags)

  37. public int saveLayerAlpha(float left, float top, float right, float bottom,

  38. int alpha, int saveFlags)

saveLayer

Canvas 在一般的情况下可以看作是一张画布,所有的绘图操作如drawBitmap, drawCircle都发生在这张画布上,这张画板还定义了一些属性比如Matrix,颜色等等。但是如果需要实现一些相对复杂的绘图操作,比如多层动画,地图(地图可以有多个地图层叠加而成,比如:政区层,道路层,兴趣点层)。Canvas提供了图层(Layer)支持,缺省情况可以看作是只有一个图层Layer。如果需要按层次来绘图,Android的Canvas可以使用SaveLayerXXX, Restore 来创建一些中间层,对于这些Layer是按照“栈结构“来管理的:

创建一个新的Layer到“栈”中,可以使用saveLayer, savaLayerAlpha, 从“栈”中推出一个Layer,可以使用restore,restoreToCount。但Layer入栈时,后续的DrawXXX操作都发生在这个Layer上,而Layer退栈时,就会把本层绘制的图像“绘制”到上层或是Canvas上,在复制Layer到Canvas上时,可以指定Layer的透明度(Layer),这是在创建Layer时指定的:public int saveLayerAlpha(RectF bounds, int alpha, int saveFlags)本例Layers 介绍了图层的基本用法:Canvas可以看做是由两个图层(Layer)构成的,为了更好的说明问题,我们将代码稍微修改一下,缺省图层绘制一个红色的圆,在新的图层画一个蓝色的圆,新图层的透明度为0×88。

[java]  view plain copy

  1. public class Layers extends Activity {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

  • 思维脑图
  • 性能优化学习笔记


  • 性能优化视频

    当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

3224915433)]
[外链图片转存中…(img-zvKHsSFo-1713224915434)]

  • 性能优化视频
    [外链图片转存中…(img-3DFeYM6W-1713224915435)]
    当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值