AnimationSet性能问题

时间:2016-03-03 23:02:17

标签: android performance animation android-animation

我开始在Android中使用动画并且想要正确地完成它。所以,基本上,我想实现这样的事情: enter image description here

我的代码:

frg_wave.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         android:id="@+id/content"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

<View
    android:id="@+id/wave_view1"
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:background="@drawable/wave_circle"
    android:layout_gravity="center"

    tools:alpha="0.2"
    />

<View
    android:id="@+id/wave_view2"
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:background="@drawable/wave_circle"
    android:layout_gravity="center"
    />

<View
    android:id="@+id/wave_view3"
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:background="@drawable/wave_circle"
    android:layout_gravity="center"
    />

<View
    android:id="@+id/wave_view4"
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_gravity="center"
    android:background="@drawable/wave_circle"
    />

<View
    android:id="@+id/wave_view5"
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_gravity="center"
    android:background="@drawable/wave_circle"
    />

在Fragment中我有

 private View mWave1;
private View mWave2;
private View mWave3;
private View mWave4;
private View mWave5;

private AnimatorSet setAnimation;



PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(View.SCALE_X, 10F);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 10F);
PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat(View.ALPHA, 1F, 0.05F);

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.frg_wave, container, false);
    mWave1 = view.findViewById(R.id.wave_view1);
    mWave2 = view.findViewById(R.id.wave_view2);
    mWave3 = view.findViewById(R.id.wave_view3);
    mWave4 = view.findViewById(R.id.wave_view4);
    mWave5 = view.findViewById(R.id.wave_view5);
    setupAnimatorSet();
    return view;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setAnimation.start();
}

private void setupAnimatorSet(){
    setAnimation = new AnimatorSet();

    setAnimation.play(waveAnimation(mWave1));

    setAnimation.play(waveAnimation(mWave2)).after(1000L);

    setAnimation.play(waveAnimation(mWave3)).after(2000L);

    setAnimation.play(waveAnimation(mWave4)).after(3000L);

    setAnimation.play(waveAnimation(mWave5)).after(4000L);

}



private ObjectAnimator waveAnimation(View view){
    ObjectAnimator scaleAnimation =
            ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, alpha);
    scaleAnimation.setRepeatCount(ValueAnimator.INFINITE);
    scaleAnimation.setDuration(5000L);
    return scaleAnimation;
}

和wave_circle.xml是

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">

<solid android:color="@color/colorAccent"/>

它似乎工作正常,但我启用GPU渲染,看到我没有很好的实现。我非常接近限制,如果我添加其他动画(例如视图旋转),我将超过16毫秒的限制。 enter image description here

有谁知道,我做错了什么? P.S我也尝试用android:hardwareAccelerated="true",但它对我帮助不大。

1 个答案:

答案 0 :(得分:3)

多个缩放动画会给RenderAnimator带来负担,这就是您遇到FPS下降的原因。您还会为对象的ObjectAnimator解析属性丢失一些fps,而您可以尝试使用ViewPropertyAnimator

您可以通过设置ImageView Matrix动画来改善这一点,它有setScale(xScale, yScale)。这意味着您必须使用某些ValueAnimator仅对比例因子设置动画,应用Matrix scale factors并将其设置为ImageView s:

Matrix matrix = new Matrix();
matrix.setScale(scale, scale, mPivotX, mPivotY);
mTargetScalingView.setImageMatrix(matrix);
如果你在Canvas上绘制圆圈,那么你将会实现

但最佳性能,这是相对容易的事情,然后只动画圆圈的半径,这将模仿你想要实现的扩展。我想你想要实现更好的应用程序的动画,这基本上是增加圆的半径并减少纯色的alpha并产生新的圆圈到颜色达到完全透明所需的时间的一半(是的) ,这就是我所看到的)。如果您想达到60fps,Canvas动画很棒。

小心你不要在这里执行任何繁重的迭代/操作,否则你将无法获得60fps。

这会将视图层次结构切换为只有一个视图,而不是您想要设置动画的波数,这是另一个胜利!