1. 程式人生 > >Android view layer type(hardware layer和硬體加速的區別)

Android view layer type(hardware layer和硬體加速的區別)

誤解:

之前混淆了 硬體加速 和 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吧。

好處
  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();