浅谈画笔Xfermode
来源:互联网 发布:网络短剧排名 编辑:程序博客网 时间:2024/05/20 01:13
Xfermode
老实说,这个东西我查了很多很久,都没有具体翻译,不过国内有不少大神称呼其为混合模式,姑且这么称呼吧。
它主要作用是画布canvas绘画是两个目标之间的显示模式,如下图:
其中Dst你可以看做背景图
Src是你正在画的图
而上面那图显示了16种两张图片混合下显示的模式、
举个例子
比如SrcIn这个模式就非常常用,用这个模式可以制作圆形图片啊,圆角图片啊,
具体实现原理非常简单,其实就是三步
第一步:先在canvas画一个圆
第二步:将画笔的xfermode属性设置为srcin模式
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
第三步,在canvas画你要显示的图片
因为从上面那十六模式图我们可以看到,srcin模式就是只显示两个绘画图层重叠的那个部分,所以因为你第一个图层是一个圆,所以你第二次画上去的虽然是一张方形的图片,但是因为叠加部分才能显示,所以一样显示的只能是圆形
其他模式一样道理,
用不同模式,可以做出各种酷炫效果,比如
loading》》》
比如,圆形的环:
具体代码如下:
public Bitmap getRound(){ Bitmap b=Bitmap.createBitmap(400,400, Bitmap.Config.ARGB_8888); Canvas canvas=new Canvas(b); Paint mp=new Paint(); mp.setColor(Color.RED); canvas.drawCircle(200,200,200,mp); mp.setColor(Color.BLUE); mp.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); canvas.drawCircle(200,200,100,mp); return b; }
这个可以得到一个圆形的环的bitmap,然后再在ondraw中将这个bitmap绘画出来,
必须这样,自己新建一个canvas,在这个新建canvas的bitmap上面绘画,然后导出新的bitmap才行,不然会发现直接画出来的图被隐藏部分变成了黑影,这是因为canvas挖去部分什么都没有了,所以是黑色的,但是导出bitmap的时候空不会被导出,所以黑色不会被导出,
当然,也可以用这样的方式在ondraw中直接使用xfermode
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); rectF.top=currentTop; /** * 设置View的离屏缓冲。在绘图的时候新建一个“层”,所有的操作都在该层而不会影响该层以外的图像 * 必须设置,否则设置的PorterDuffXfermode会无效,具体原因不明 */ int sc=canvas.saveLayer(0,0,totalW,totalH,paint,Canvas.ALL_SAVE_FLAG); canvas.drawBitmap(bitmap,0,0,null); paint.setXfermode(xfermode); paint.setColor(Color.RED); canvas.drawRect(rectF,paint); paint.setXfermode(null); /** * 还原画布,与canvas.saveLayer配套使用 */ canvas.restoreToCount(sc); if (currentTop>0){ currentTop--; postInvalidate(); } }
阅读全文
0 0
- 浅谈画笔Xfermode
- Xfermode
- Xfermode
- Xfermode
- Android 绘图进阶(一):PorterDuff与Xfermode(画笔风格)仿QQ圆形头像
- Android 绘图进阶(二):Xfermode(画笔风格)绘制涂层
- 画笔
- 画笔
- 画笔
- graphic Xfermode
- Xfermode入门
- Xfermode 介绍
- android Xfermode
- android xfermode
- Android Xfermode
- Xfermode初探
- XFermode图表
- 详解Paint的setXfermode(Xfermode xfermode)
- orcale 循环
- 图像处理之基于OTSU阈值二值化
- wchar、tchar、L等宽窄字符的含义与转换
- Java多态中重载方法参数分别为父类和子类时的疑惑
- kerberos管理开发总结
- 浅谈画笔Xfermode
- postgres 从修改行返回数据
- OkHttp拦截器POST添加公共参数
- 11.21第14节课
- CATIA小插件发布步骤及解析
- Android Local Manifests机制
- 微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项
- 从DICOM开始入门医学图像处理-1-开发工具
- Resources.class.getResourceAsStream 获取配置的方法