我开始在Android中使用动画并且想要正确地完成它。所以,基本上,我想实现这样的事情:
我的代码:
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毫秒的限制。
有谁知道,我做错了什么?
P.S我也尝试用android:hardwareAccelerated="true"
,但它对我帮助不大。
答案 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。
这会将视图层次结构切换为只有一个视图,而不是您想要设置动画的波数,这是另一个胜利!