Xfermodes
AvoidXfermode
PixelXorXfermode
此外,还有一些操作在使用硬件加速的时候会表现不一样:
Canvas
clipRect(): XOR, Difference 和 ReverseDifference 裁剪模式 被忽略. 3D转换不能用来裁剪长方形
drawBitmapMesh(): 颜色数组被忽略
Paint
setDither(): 忽略
setFilterBitmap(): 过滤一直是打开的
setShadowLayer(): 只能在文字模式下工作
PorterDuffXfermode
PorterDuff.Mode.DARKEN 和 SRC_OVER 是一样的当混合到帧缓存.
PorterDuff.Mode.LIGHTEN和 SRC_OVER 是一样的当混合到帧缓存
PorterDuff.Mode.OVERLAY和 SRC_OVER 是一样的当混合到帧缓存.
ComposeShader
ComposeShader只能包含不一样类型的着色器 (例如一个BitmapShader和LinearGradient实例,但不能是两个BitmapShader实例 )
ComposeShader不能包含ComposeShader
如果你的应用由于上面的这些不支持的特性或限制影响,你可以通过调用setLayerType(View.LAYER_TYPE_SOFTWARE, null)来对你的应用受影响的部分关闭硬件加速。这样的话,你还是可以在其他地方利用硬件加速的优点。查看 Controlling Hardware Acceleration来获取更多的关于在不同的层次使能和不是能硬件加速。
View层
在所有的Android版本中,view都可以通过使用View的绘制缓存或者使用Canvas.saveLayer()来渲染到离屏缓存。离屏渲染缓存或者层有许多的用途。你可以在为复杂的view设置动画或应用组合效果时 使用他们来获取更好的性能。例如,你可以使用Canvas.saveLayer()来临时的把一个VIew渲染到一个层,然后又以另一个透明因子来把他重新渲染到屏幕上 来获取一个褪色的效果。
从Android3.0开始,通过使用View.setLayerType(),你可以更好的控制或者使用层。这个函数使用两个参数:你想使用的层的类型和一个可选的Panit对象,这个Paint对象描叙了如何组成的。你可以使用Paint参数来应用颜色过滤,特殊的混合模式,或者Layer的透明属性,一个View可以使用如下三种Layer类型之一:
LAYER_TYPE_NONE:这个View被正常渲染,不使用离屏缓存,缺省就是这种类型
LAYER_TYPE_HARDWARE:如果硬件加速使能了,View以硬件加速的方式渲染到硬件纹理;如果没有使能硬件加速,他的行为则跟LAYER_TYPE_SOFTWARE是一样的
LAYRE_TYPE_SOFTWARE:View被以软件的方式渲染到一个bitmap.
使用何种layer依赖与你的目的:
性能:使用硬件加速层来把view渲染到一个硬件纹理。一旦一个view渲染到了一个层,他的绘制代码不会执行,除非这个view调用了invalidate().某些动画,如alpha动画,可以直接应用到一个层上,这对于GPU来说是非常高效的。
虚拟化效果:使用一个硬件或者软件层已经一个Paint来对一个View进行特殊的处理。例如你可以通过使用ColorMatrixColorFilter来绘制一个黑白相间的view.
兼容性:使用一个软件层的layer来强制一个view以软件的方式渲染。如果一个View在使用硬件加速的时候有问题(例如,如果你整个应用都使能了硬件加速),在硬件渲染管线有问题的时候使用软件方式将会是一个简单的方式。
AvoidXfermode
PixelXorXfermode
此外,还有一些操作在使用硬件加速的时候会表现不一样:
Canvas
clipRect(): XOR, Difference 和 ReverseDifference 裁剪模式 被忽略. 3D转换不能用来裁剪长方形
drawBitmapMesh(): 颜色数组被忽略
Paint
setDither(): 忽略
setFilterBitmap(): 过滤一直是打开的
setShadowLayer(): 只能在文字模式下工作
PorterDuffXfermode
PorterDuff.Mode.DARKEN 和 SRC_OVER 是一样的当混合到帧缓存.
PorterDuff.Mode.LIGHTEN和 SRC_OVER 是一样的当混合到帧缓存
PorterDuff.Mode.OVERLAY和 SRC_OVER 是一样的当混合到帧缓存.
ComposeShader
ComposeShader只能包含不一样类型的着色器 (例如一个BitmapShader和LinearGradient实例,但不能是两个BitmapShader实例 )
ComposeShader不能包含ComposeShader
如果你的应用由于上面的这些不支持的特性或限制影响,你可以通过调用setLayerType(View.LAYER_TYPE_SOFTWARE, null)来对你的应用受影响的部分关闭硬件加速。这样的话,你还是可以在其他地方利用硬件加速的优点。查看 Controlling Hardware Acceleration来获取更多的关于在不同的层次使能和不是能硬件加速。
View层
在所有的Android版本中,view都可以通过使用View的绘制缓存或者使用Canvas.saveLayer()来渲染到离屏缓存。离屏渲染缓存或者层有许多的用途。你可以在为复杂的view设置动画或应用组合效果时 使用他们来获取更好的性能。例如,你可以使用Canvas.saveLayer()来临时的把一个VIew渲染到一个层,然后又以另一个透明因子来把他重新渲染到屏幕上 来获取一个褪色的效果。
从Android3.0开始,通过使用View.setLayerType(),你可以更好的控制或者使用层。这个函数使用两个参数:你想使用的层的类型和一个可选的Panit对象,这个Paint对象描叙了如何组成的。你可以使用Paint参数来应用颜色过滤,特殊的混合模式,或者Layer的透明属性,一个View可以使用如下三种Layer类型之一:
LAYER_TYPE_NONE:这个View被正常渲染,不使用离屏缓存,缺省就是这种类型
LAYER_TYPE_HARDWARE:如果硬件加速使能了,View以硬件加速的方式渲染到硬件纹理;如果没有使能硬件加速,他的行为则跟LAYER_TYPE_SOFTWARE是一样的
LAYRE_TYPE_SOFTWARE:View被以软件的方式渲染到一个bitmap.
使用何种layer依赖与你的目的:
性能:使用硬件加速层来把view渲染到一个硬件纹理。一旦一个view渲染到了一个层,他的绘制代码不会执行,除非这个view调用了invalidate().某些动画,如alpha动画,可以直接应用到一个层上,这对于GPU来说是非常高效的。
虚拟化效果:使用一个硬件或者软件层已经一个Paint来对一个View进行特殊的处理。例如你可以通过使用ColorMatrixColorFilter来绘制一个黑白相间的view.
兼容性:使用一个软件层的layer来强制一个view以软件的方式渲染。如果一个View在使用硬件加速的时候有问题(例如,如果你整个应用都使能了硬件加速),在硬件渲染管线有问题的时候使用软件方式将会是一个简单的方式。