Android - 画布上的表演动画

时间:2015-04-10 10:02:29

标签: android animation canvas

我在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

2 个答案:

答案 0 :(得分:0)

设定后:

finalAnimator.setFrameDelay(0);
baseAnimator.setFrameDelay(0);
动画看起来很顺利。谢谢你的建议!

答案 1 :(得分:-1)

您可以使用处理程序通过其postDelayed()方法调用invalidate。在整个动画持续时间内定期调用此方法。您可以根据current_time / total_time的比率计算半径,并乘以您想要的最大半径。