上一篇《Android Canvas Matrix —— 从CircleImageView说起》是我对CircleImageView项目的学习和思考,这篇说一下从“绘制圆形头像”这个出发点深入下去的收获——如何将Bitmap绘制出来,如何控制Bitmap的绘制过程。

这篇博文只讨论绘制过程,所以不考虑Bitmap的获取和解析。

参见上图,绘制Bitmap的方法,基本有两种:1. Canvas.drawBitmap();方法。2. 和CircleImageView中的做法一样,使用BitmapShader,将Bitmap作为Paint的属性。

那么对Bitmap绘制过程的控制,也自然从这两方面入手,因为上一篇博文已经谈到了Shader的用法,这里重点讨论第一种方法——drawableBitmap()。

这个方法中,参与的对象有Canvas、Bitmap和Paint,分别控制这三个要素都可以达到控制Bitmap绘制的效果。Canvas的来源有两个,Bitmap和View。所以对于Bitmap的控制,也就是对于Canvas的控制(就是在绘制之前,先对Bitmap进行重绘,在重绘的过程中进行变换),所以主要就是对Canvas和Paint的调整。

对于Canvas,使用Matrix进行变换,在平面中的变换方式主要有scale、rotate、translate三种。这里先插入一段我对Canvas的理解:

不同于网上通常将Canvas理解为画布,我更倾向于将Canvas理解为坐标系(coordinate)。一个原因就是实际上我们在View或Bitmap上绘制的内容,都是绘制到了屏幕或Bitmap上,都是有限的大小,目标介质才是真正意义上的“画布”,而Canvas是无限大的。将Canvas理解为坐标系之后,Canvas实际上就成了我们绘制内容的 参考基准,这很重要。所以我们绘制内容的时候,要知道我们是基于什么样的坐标系进行绘制的。

有了上面的理解,下面的内容就容易的多了。首先,默认的Canvas的原点,在绘制区域的左上角,如果对Canvas进行位移,效果是这样的:

上图中,右侧红色位置为偏移后的坐标系,如果我们使用Canvas绘制一个矩形,那么位移前后绘制的效果就可想而知了。

因为Canvas内部也是通过Matrix进行控制变换的,所以这些变换的效果,同样适合于任意使用Matrix控制的元素,包含Shader,所以在上一篇博文中,CircleImageView库中对居中的操作,原理上和上图是一样的。

需要注意的的是,通过Matrix进行变换,那么Matrix必然会保留变换之后的状态,那么如果进行多次变换,就会造成变换的累加,我们要善用累加,避免因为累加造成的困惑。Canvas提供了save();和restore();两个方法对Canvas的状态进行暂存和恢复,当我我们需要在不同的坐标系状态下绘制不同的内容时,就需要使用save();和restore();,这两个方法配合的效果,类似“LS打法”,在将Canvas变换前,先使用save();方法,保存Cavnas的状态,绘制完之后,使用restore();方法恢复到上次save();的状态,进行下一次变换和绘制。

注意:这里再一次关联到上文提到的我对Canvas是坐标系的理解,因为虽然进行了restore();操作,但是之前绘制的内容是不会被清除的,就是说save();和restore();只是针对坐标系的变换而言。也之所以这样,才给了绘制多个内容的可能。

使用save();和restore();的效果如下图:

理解了Canvas的真正含义和Matrix的变换方法,以及“LS打法”的操作,对于Canvas绘制图像的基础,应该没有问题了,下面说一下如何对图片进行“裁切”。这里之所以用了引号,因为这个“裁切”实际上是遮罩——只显示需要显示的内容,对不需要显示的内容进行遮挡或拦截。

通过Paint的setXfermode()方法,设置Paint的遮罩模式,即可对稍后绘制的内容应用遮罩效果。还是以圆形头像为例,通过下面的方法,即可将Bitmap“裁剪”成圆形:

// desRect 目标绘制区域范围

// rect Bitmap范围

canvas.drawCircle(desRect.centerX(), desRect.centerY(), desRect.right - desRect.centerX(), paint);

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));

canvas.drawBitmap(bitmapimg, rect, desRect, paint);

通过设置Mode.SRC_IN的模式,将使得drawBitmap();的结果,只在之前绘制的circle内部可以显示出来,也就是SRC_IN的含义。这样就可以得到一个圆形的Bitmap(代码中得canvas是新建的Bitmap中的canvas)。

bitmap画文字 居中_Android Canvas Matrix —— Bitmap是如何画出来的相关推荐

  1. android canvas添加文字居中,android Canvas drawText 文字居中

    1首先利用canvas获取画布的宽高, //获取屏幕的宽和高 int width = canvas.getWidth(); int height = canvas.getHeight(); 2获取文字 ...

  2. html5 canvas 显示文字居中,html5 canvas 文字居中对齐

    > web前端 > HTML 5 > 正文 html5 canvas 文字居中对齐 2013-07-09 我要投稿 [color=eight:25px]html部门 [color=e ...

  3. bitmap画文字 居中_【每日问答29】一键居中CAD表格中的文字

    文尾左下角阅读原文看视频教程 好课推荐: 1.CAD2014:点击查看 2.室内CAD:点击查看 3.CAD2019:点击查看4.CAD2018:点击查看5.Bim教程:点击查看6.室内手绘:点击查看 ...

  4. bitmap画文字 居中_画非画展览馆 观赏石 第八期拍卖

    展览馆介绍 画非画展览馆  经过近一年的扩建升级,第一期工程已初具规模,展览馆分为十个厅,已于2020年9月19日正式开馆.馆内将陈列展示来自世界各地的奇珍异石和各类高端艺术品.画非画展览馆诚邀有识之 ...

  5. canvas文字居中;canvas画布文字右对齐;canvas画布文字左对齐;canvas文字自动换行;canvas设置行间距;

    canvas参考手册 场景:画布绘制文本,使用 context.fillText(text,x,y,maxWidth).文本对其也就是设置xy坐标问题. 以下的画布设定宽度假设都是width:500 ...

  6. android textview 文字居中_Android布局优化,看这3点就够了

    码个蛋(codeegg)第 712 次推文 作者:Android技术 博客:https://www.jianshu.com/p/2ee61b88175e 前言 在编写Android布局时总会遇到这样或 ...

  7. 关于canvas的里fillText文字居中和画布清空重画内容

    先在结构中写一个canvas元素 <canvas id="myCanvas1" width="88" height="88">& ...

  8. Canvas绘制Bitmap 友盟分享纯图片至微信好友

    1.需求场景 Android开发中,有将带有二维码的纯图片分享给微信需求 ,左是分享一张内容固定图片,右是需求实现图片            目前,我们有一个需求是不同用户报名活动成功后分享出去的图片 ...

  9. Android 中一些常用类的常用方法(Math、Random、Color、Paint、Canvas、Bitmap、BitmapFactory)...

    1.java.lang.Math类常用的常量和方法: Math.PI 记录的圆周率 Math.E 记录e的常量 Math.abs 求绝对值 Math.sin 正弦函数 Math.asin 反正弦函数 ...

最新文章

  1. ECLIPSE3.2安装 + 汉化 + 配置SWT DESIGNER6.2.0
  2. Myxls导出excel报表
  3. VTK修炼之道83:Pipeline管线执行模型
  4. lgg6 android 9,LG G6的18:9屏幕用起来到底是什么样
  5. linux --常用命令
  6. jsp中获取list长度
  7. 监控-Kafka Manager
  8. Java 阶乘(BigInteger)
  9. 影音先锋云服务器,影音先锋云服务器
  10. Redis过期策略和淘汰策略
  11. 小米商城jsp代码_小米小爱鼠标评测:语音输入能否战未来
  12. 刷脸支付便利更好推动普惠金融的落地
  13. pip install xx 时遇到There was a problem confirming the ssl certificate...的解决办法
  14. 在vmware里面免费安装纯净的xp虚拟机
  15. 为Debian解决Mercury MW150US无线网卡驱动
  16. ciscn_2019_n_7(exit_hook)、wdb_2018_1st_babyheap(fsop的例子)
  17. CorelDRAW常用工具之渐变工具
  18. java中compare语句的用法,compare的用法_java中 compareTo()的程序代码及用法
  19. 从输入 url 到页面展示到底发生了什么
  20. STC8H8k64U——定时器T0(60s倒计时)

热门文章

  1. Java小项目——聊天室(多线程版本)
  2. 使用VMware Tools在主机和虚拟机之间进行复制粘贴
  3. 7-1 动物世界 (15分)
  4. wget socks5 代理
  5. ECE220生存指南[03]MP8: 递归函数实现油漆桶问题,Flood Fill with Recursion
  6. 中国JAVA第一人张立猛,《我的世界》建造中国地图第一人。
  7. 中小型企业OA的需求和预算之间有什么关联?
  8. SMARTFORMS换行
  9. 共享存储集群规范化部署
  10. Div居中的几种方法,Div absolute居中