Android View layer

1480阅读 0评论2015-05-11 myfaxmail
分类:Android平台

View layers

  在所有版本的Android中,views都有画到离屏缓冲的能力,这包括使用view的绘制cache,或使用Canvas.saveLayer().离屏缓冲,或者说层,有很多用处.你可以使用它们来为复杂的view动画或使用组合效果时提高性能.例如,你可以使用Canvas.saveLayer()实现淡出效果,这个方法会临时的把一个view画到一个layer中然后使用一个透明系数把它组合回屏幕上.


  从Android3.0 (API level11)开始,你对何时以及如何通过View.setLayerType()方法来使用layer有了更多的控制能力.此方法有两个参数:你想使用的layer的类型和一个可选的Paint对象,这个对象描述了layer应被如何组合.你可以使用Paint参数来应用颜色过滤,或指定混合模式或不透明度到一个layerview可以使用以下三个类型之一:


  要使用哪种layer类型取决于你的目标:

View layers 和动画

  当你的应用被硬加速时,硬件layer可以提供更快更平滑的动画.当向一个有很多绘制操作的复杂的view应用动画时,要永远保证以60fps的速度运行是不可能的.但这可以通过使用硬件layersview呈现到硬件纹理中来减轻一些负担.硬件纹理之后可以被用来产生动画,避免view为了产生动画而不断的重画自己.view在其属性发生改变而调用invalidate()或你主动调用invalidate()之前不会重画,如果你正在你的应用运行动画但是并不能获得平滑的效果,那么可以考虑在你的动画view上启用硬件layer


  当一个view被硬件layer所支持,它的一些属性的处理就跟layer混合到屏幕上的方式相关了.设置这些属性的操作将变得更高效,因为它们不再导致view变得无效再重绘了.下面列出的就是这些属性,调用这些属性的设置器时会对invalidation操作产生最佳的优化并且不再重画目标view

  这些属性是在使用一个ObjectAnimatorview产生动画时使用的.如果你想操作这些属性,调用适当的settergetter即可.例如,要改变透明属性,调用setAlpha().下面的代码片段演示了让一个View绕Y轴进行三维变换的最佳方法:

[javascript] view plaincopy
  1. view.setLayerType(View.LAYER_TYPE_HARDWARE, null);  
  2. ObjectAnimator.ofFloat(view, "rotationY", 180).start();  

  因为硬件layers使用显卡内存,所以强烈建议你只在动画期间使用它们并在动画结束后禁止它们.你可以使用动画侦听器来做到:

[javascript] view plaincopy
  1. View.setLayerType(View.LAYER_TYPE_HARDWARE, null);  
  2. ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);  
  3. animator.addListener(new AnimatorListenerAdapter() {  
  4.     @Override  
  5.     public void onAnimationEnd(Animator animation) {  
  6.         view.setLayerType(View.LAYER_TYPE_NONE, null);  
  7.     }  
  8. });  
  9. animator.start();  


提示和技巧

  切换到2D图形硬加速能立即提升性能,但是你仍然需要按照以下建议来有效使用GPU


上一篇:Android Project Butter分析
下一篇:Android native heap memory leak 实战(二) --- DDMS