我在CustomView中创建了简单的动画来转换beetwen活动。一切都很好,除了动画流畅。当圆半径增加时,存在可见的滞后。我如何表现动画以避免滞后?
public class CircleAnimationView extends View {
...
public void startAnimation(int x, int y) {
startX = x;
startY = y;
baseAnimator = ObjectAnimator.ofFloat(this, "baseRadius", 0, maxRadius)
.setDuration(1000);
baseAnimator
.setInterpolator(new AccelerateDecelerateInterpolator());
baseAnimator.start();
finalAnimator = ObjectAnimator.ofFloat(this, "finalRadius", 0, maxRadius)
.setDuration(2000);
finalAnimator
.setInterpolator(new AccelerateDecelerateInterpolator());
if(listener!=null)
finalAnimator.addListener(listener);
finalAnimator.start();
}
public void setBaseRadius(final float radius) {
radiusBase = radius;
invalidate();
}
public void setFinalRadius(final float radius) {
radiusFinal = radius;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (isInEditMode()) {
return;
}
canvas.drawCircle(startX, startY, radiusBase, basePaint);
canvas.drawCircle(startX, startY, radiusFinal, finalPaint);
}
};
我在xml中使用了视图:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/content_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
</RelativeLayout>
<pl.org.ldi.challenge.views.CircleAnimationView
android:id="@+id/circle_animation"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:base_color="@color/blue"
app:final_color="@color/white"/>
</RelativeLayout>
编辑: 我从动画中检查.trace文件,看起来绘制大圆圈需要花费太多时间 - 方法GLES20Canvas.nDrawDisplayList
答案 0 :(得分:0)
设定后:
finalAnimator.setFrameDelay(0);
baseAnimator.setFrameDelay(0);
动画看起来很顺利。谢谢你的建议!
答案 1 :(得分:-1)
您可以使用处理程序通过其postDelayed()方法调用invalidate。在整个动画持续时间内定期调用此方法。您可以根据current_time / total_time的比率计算半径,并乘以您想要的最大半径。