Android view layer type(hardware layer和硬體加速的區別)
阿新 • • 發佈:2019-01-31
誤解:
之前混淆了 硬體加速 和 view hardware layer。就奇怪 硬體加速 是API 14後預設的,那為什麼動畫結束時,又要吧layer type設定為none,說這樣可以節省記憶體(video memory)
硬體加速繪製模型(hardware accelerate)
- Android 3.0 引入,4.0為預設渲染模型
View hardware layer
- 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(離屏緩衝區),也就說 正常是把view 繪製到螢幕對應的記憶體,但也可以繪製到 另一塊記憶體中。所以layer實際就是一個buffer吧。
好處
- 複雜的View進行動畫時
- 對View進行混合效果,如 fade effect(漸變),可以用Canvas.saveLayer()暫時將view繪製到layer中,然後 composite(混合 )opacity factor到螢幕上,這個composite(混合)可以由HWC(
當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();