Android中的自绘View的那些事儿(四)之 ComposeShader组合渲染器的简介
我们已经在之前的文章:
《Android中的自绘View的那些事儿(二)之Shader渲染器和BitmapShader位图渲染器的简介》
《Android中的自绘View的那些事儿(三)之 颜色渐变渲染器:LinearGradient、RadialGradient 和SweepGradient的简介》
中介绍过渲染器基类Shader以及它五个子类中的BitmapShader、LinearGradient、RadialGradient 以及SweepGradient的使用。今天我们继续来谈谈最后一个渲染器——ComposeShader组合渲染器,它也是五个中最为复杂的渲染器
ComposeShader组合渲染器
ComposeShader就是组合性渲染器,给定渲染器A、B和组合模式。当模式被应用时,它将得到一个渲染器A作为它的“DST”的结果,以及渲染器B作为它的“SRC”的结果。它有两个构造函数,我们先来看看:
ComposeShader (Shader shaderA, // 渲染器A被视为“DST”的模式,此值不能为空 Shader shaderB, // 渲染器B被看作是“SRC”的模式,此值不能为空 Xfermode mode) // 将两个渲染器组合在一起的模式,接收Xfermode对象,若为null,则默认为src_overComposeShader (Shader shaderA, // 渲染器A被视为“DST”的模式,此值不能为空 Shader shaderB, // 渲染器B被看作是“SRC”的模式,此值不能为空 PorterDuff.Mode mode) // 将两个渲染器组合在一起的模式,接收PorterDuff的Mode枚举,此值不能为空
在开始介绍ComposeShader前,我们先来了解上面两个构造函数中Xfermode和PorterDuff.Mode它们是什么。
Xfermode和PorterDuff
Xfermode是被称为实现自定义的“transfer-modes”的绘制管道对象的基类。它的子类实现构造函数中接收模式的枚举PorterDuff 使实现预定义的绘制管道对象。它的子类一般是PorterDuffXfermode类,它可以使用图像16种组合模式规则来控制Paint对Canvas图像进行交互。要应用转换模式,可以使用Paint的setXfermode方法。
在Android SDK 目录下…\samples\android-23\legacy\ApiDemos\src\com\example\android\apis\graphics有一个Xfermodes.java类,它是一个Activity,使用它代码运行程序可见下图:
输出结果中列出了16种组合模式,也就是对应PorterDuff.Mode枚举中的16个值。好了,已经知道了Xfermode和PorterDuff怎样使用后,我们来看看ComposeShader的示例吧。
示例:
public class MyView extends View { public MyView(Context context) { this(context, null, 0); } public MyView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.icon); int width = bitmap.getWidth(); int height = bitmap.getHeight(); BitmapShader bitmapShaderDst = new BitmapShader(bitmap, Shader.TileMode.CLAMP,Shader.TileMode.CLAMP); RadialGradient radialGradientSrc = new RadialGradient(width / 2, height / 2, width / 2, new int[] { Color.WHITE, Color.TRANSPARENT }, null, Shader.TileMode.CLAMP); ComposeShader composeShader = new ComposeShader(bitmapShaderDst, radialGradientSrc, PorterDuff.Mode.MULTIPLY); paint.setShader(composeShader); canvas.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint); }}
上面代码中,先有一个BitmapShader渲染器对象和一个RadialGradient渲染器对象,然后将其当做参数传给ComposeShader的构造函数,并使用MULTIPLY的模式
运行效果:
更多相关文章
- C语言函数的递归(上)
- 在Android中使用ViewPager实现左右滑动页面
- Android时间(TimePicker)日期(DatePicker)控件联动
- Android系统启动之Zygote
- android性能测试systrace
- 初学Android,自动朗读TTS(五十二)
- Android(安卓)指纹识别开发实例
- [Android(安卓)API学习]Data Storage胡乱翻译(1)
- Android内存泄漏检测工具大全