Android view layer type(hardware layer和硬件加速的区别)

误解:

之前混淆 硬件加速 和 view hardware layer。
就奇怪 硬件加速 是API 14后默认的,那为什么动画结束时,又要吧layer type设置为none,说这样可以节省内存(video memory)

硬件加速(hardware accelerate)
  • 是一种技术:使用特殊硬件(GPU) 处理图像(之前是CPU,GPU的运算快、高并发、逻辑处理慢)
  • Android 3.0 引入,4.0为默认渲染模型
  • OpenGL在手机上采用 硬件渲染(实际OpenGL也可以软件渲染的)
View hardware layer
  • 是GPU里的纹理(内存、buffer)r:就是通过OpenGL在GPU里申请一块内存(纹理),保存当前绘制。不用每次都重新绘制。
  • hardware layer是view layer的一种,而view layer机制在所有的Android版本都可用
  • view layer默认的是LAYER_TYPE_NONE, 没有off-screen buffer(离屏缓冲区) 支持。所以动画执行时用hardware layer type,执行完重新回归到 LAYER_TYPE_NONE
  • 关联是LAYER_TYPE_HARDWARE layer type在硬件加速模型开启中,会讲view 绘制到 hardware texture(纹理),如果没有开启 硬件加速,则等同于选择LAYER_TYPE_HARDWARE

View Layer

  • view可以被绘制到off-screen buffers(离屏缓冲区)
  • layer就是一个buffer
好处
  • 大白话:比如粉丝 挥舞着周杰伦的海报,等于做translation(位移)动画。 粉丝只拿一个海报,而不是N个海报,每次位移就 换一张吧。
  • 相当于在GPU里保存 周杰伦的海豹
  1. 复杂的View进行动画时
  2. 对View进行混合效果,如 fade effect(渐变),可以用Canvas.saveLayer()暂时将view绘制到layer中,然后 composite(混合 )opacity factor到屏幕上,这个composite(混合)可以由HWC(Hardware Composer) 这种硬件进行处理。所以绘制的性能就会更高。

当view使用hardware layer back(备份、支持)时,部分属性 是不需要
有composite(混合)的属性:

  • alpha: Changes the layer’s opacity
  • x, y, translationX, translationY: Changes the layer’s position
  • scaleX, scaleY: Changes the layer’s size
  • rotation, rotationX, rotationY: Changes the layer’s orientation in 3D space
  • pivotX, pivotY: Changes the layer’s transformations origin

离屏缓冲区消耗内存,所以需要在动画完成后切换到NONE的layer

代码
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        view.setLayerType(View.LAYER_TYPE_NONE, null);
    }
});
animator.start();

你可能感兴趣的:(Android)