专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
复利大王  ·  江浙沪美女留子回国下嫁怀孕后悔 ·  昨天  
复利大王  ·  某航离谱瓜! ·  昨天  
复利大王  ·  某一线女网红下海? ·  昨天  
复利大王  ·  老同学中捞一捞能不能找到免费P友 ·  2 天前  
复利大王  ·  不讲武德!中x银行? ·  2 天前  
51好读  ›  专栏  ›  安卓开发精选

Android 中 Canvas 绘图之 PorterDuffXfermode 使用及工作原理详解

安卓开发精选  · 公众号  · android  · 2017-02-25 21:57

正文

请到「今天看啥」查看全文


示例二


下面我们使用PorterDuffXfermode对上面的代码进行一下修改,修改后的代码如下所示:


@Override

protected void onDraw ( Canvas canvas ) {

super . onDraw ( canvas );

//设置背景色

canvas . drawARGB ( 255 , 139 , 197 , 186 );

int canvasWidth = canvas . getWidth ();

int r = canvasWidth / 3 ;

//正常绘制黄色的圆形

paint . setColor ( 0xFFFFCC44 );

canvas . drawCircle ( r , r , r , paint );

//使用CLEAR作为PorterDuffXfermode绘制蓝色的矩形

paint . setXfermode ( new PorterDuffXfermode ( PorterDuff . Mode . CLEAR ));

paint . setColor ( 0xFF66AAFF );

canvas . drawRect ( r , r , r * 2.7f , r * 2.7f , paint );

//最后将画笔去除Xfermode

paint . setXfermode ( null );

}


效果如下所示:


下面我们对以上代码进行一下分析:


  1. 首先,我们调用了canvas.drawARGB(255, 139, 197, 186)方法将整个Canvas都绘制成一个颜色,此时所有像素都不透明。

  2. 然后我们通过调用canvas.drawCircle(r, r, r, paint)绘制了一个黄色的圆形到Canvas上面。

  3. 然后我们执行代码paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)),将画笔的PorterDuff模式设置为CLEAR。

  4. 然后调用canvas.drawRect(r, r, r * 2.7f, r * 2.7f, paint)方法绘制蓝色的矩形,但是最终界面上出现了一个白色的矩形。

  5. 在绘制完成后,我们调用paint.setXfermode(null)将画笔去除Xfermode。


我们具体分析一下白色矩形出现的原因。一般我们在调用canvas.drawXXX()方法时都会传入一个画笔Paint对象,Android在绘图时会先检查该画笔Paint对象有没有设置Xfermode,如果没有设置Xfermode,那么直接将绘制的图形覆盖Canvas对应位置原有的像素;如果设置了Xfermode,那么会按照Xfermode具体的规则来更新Canvas中对应位置的像素颜色。就本例来说,在执行canvas.drawCirlce()方法时,画笔Paint没有设置Xfermode对象,所以绘制的黄色圆形直接覆盖了Canvas上的像素。当我们调用canvas.drawRect()绘制矩形时,画笔Paint已经设置Xfermode的值为PorterDuff.Mode.CLEAR,此时Android首先是在内存中绘制了这么一个矩形,所绘制的图形中的像素称作源像素(source,简称src),所绘制的矩形在Canvas中对应位置的矩形内的像素称作目标像素(destination,简称dst)。源像素的ARGB四个分量会和Canvas上同一位置处的目标像素的ARGB四个分量按照Xfermode定义的规则进行计算,形成最终的ARGB值,然后用该最终的ARGB值更新目标像素的ARGB值。本例中的Xfermode是PorterDuff.Mode.CLEAR,该规则比较简单粗暴,直接要求目标像素的ARGB四个分量全置为0,即(0,0,0,0),即透明色,所以我们通过canvas.drawRect()在Canvas上绘制了一个透明的矩形,由于Activity本身屏幕的背景时白色的,所以此处就显示了一个白色的矩形。




示例三


我们在对示例二中的代码进行一下修改,将绘制圆形和绘制矩形相关的代码放到canvas.saveLayer()和canvas.restoreToCount()之间,代码如下所示:







请到「今天看啥」查看全文


推荐文章
复利大王  ·  某航离谱瓜!
昨天
复利大王  ·  某一线女网红下海?
昨天
复利大王  ·  老同学中捞一捞能不能找到免费P友
2 天前
复利大王  ·  不讲武德!中x银行?
2 天前
教你学风水转运  ·  iOS10.3.2好用吗?网友升级后经验
8 年前