使用硬件加速,提高Android的动画性能

来源:互联网 发布:软件测试经理招聘 编辑:程序博客网 时间:2024/06/05 04:57

4 最初使用动画时,在低性能手机上显示效果会很不好,尤其是有复合动画时。
在绘制动画时,你的view需要重绘每一层,如果你使用视图图层代替重绘,视图渲染只会渲染一次并会被重用。使用硬件加速会让动画绘制的更快,因为硬件会把图层缓存在GPU上。

用法

用法很简单关键方法是View.setLayerType()

  1. 在开始动画时调用View.setLayerType(View.LAYER_TYPE_HARDWARE, null)
  2. 运行动画
  3. 动画结束时调用View.setLayerType(View.LAYER_TYPE_NONE, null).

代码示例

// 设置硬件加速 myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);// 设置动画ObjectAnimator animator = ObjectAnimator.ofFloat(myView, View.TRANSLATION_X, 150);// 设置一个回调,在动画完成时取消硬件加速animator.addListener(new AnimatorListenerAdapter() {    @Override  public void onAnimationEnd(Animator animation) {    myView.setLayerType(View.LAYER_TYPE_NONE, null);  }});// 开始动画animator.start();  

如果你的sdk版本在14以上你可以使用属性动画,可以更简洁的设置硬件加速,调用withLayer()

myView.animate()    .translationX(150)  .withLayer()  .start();

注意

硬件加速可以提高动画的性能,但是切记不要滥用!

  1. 在某些情况下,硬件层会比普通view绘制多做很多的工作。缓存一个层到GPU需要花费一些时间,因为需要两个步骤:首先view绘制到GPU的一个层中,然后GPU再把这个层绘制到window上。如果只是简单的view绘制使用硬件加速会增加不必要的开销
  2. 与所有的缓存一样,GPU的硬件缓存也一样会有失败的几率。如果在动画进行中调用View.invalidate()的话,缓存的层会不得不重新渲染。如果不断有无效的硬件层产生的话,还不如不使用硬件加速。因为增加硬件层缓存会增加额外的开销。

例子

我做了一个Demo,包括简单动画,复合动画,开启硬件加速等。以下是在各种情况下的GPU绘制情况(需在开发者选项中开启GPU呈现模式),需要注意的是一定要选一个性能较差的手机。GitHub地址:https://github.com/q960757274
简单动画不开启硬件加速
简单动画不开启硬件加速
简单动画开启硬件加速
简单动画开启硬件加速
复合动画开启硬件加速
复合动画开启硬件加速

1 0
原创粉丝点击