在Android Canvas下制作动画形状的最佳做法

时间:2016-03-20 15:23:13

标签: android android-animation android-canvas android-view

我有一个自定义视图,可以绘制几个圆圈和大约10个不断更新的拱门(旋转和尺寸更改)。我试图为整个过程制作动画,但我在Canvas下找不到任何好的做法(我知道基础知识 - 使用dp而不是px等等),但是我不知道是否正常动画部分。

现在我正在迭代我的所有物体,执行一些计算以确定未来的位置并绘制它们,但它看起来不稳定。以下是我目前正在做的事情:

@Override
protected void onDraw(Canvas canvas) {
    for(Arch arch : arches) {
        arch.update();
        canvas.drawArc(arch.getRect(), -arch.getCurrentRotation(), arch.getSweepAngle(), true, paint);
    }

    //logo.draw(canvas);

    canvas.drawCircle(width / 2, height / 2, circle_size, paint_opaque);

    logo.draw(canvas);

    int textX = (int) (width / 2);
    int textY = (int) ((height / 2) - ((paint_text.descent() + paint_text.ascent()) / 2));

    canvas.drawText(text, textX, textY, paint_text);
    invalidate();
}

1 个答案:

答案 0 :(得分:2)

您的代码几乎没有问题。

  1. 您不应在自定义onDraw的{​​{1}}中执行任何操作。这是开发Android的一个非常重要的原则!理想情况下,您只能在Views方法中绘制。有时您需要根据onDraw计算某些内容,但是您应该将这些操作限制到最小。你可以预先分配和计算其他地方的所有内容(不在Canvas中),你应该从onDraw中提取。在您的情况下onDraw(我假设计算动画的下一个“框架”),您的arch.update()textX的计算应该移到其他地方。

  2. textY基本上意味着您要求重新绘制invalidate()。重新绘制View时,将调用其View。这就是为什么你真的不应该在onDraw中呼叫invalidate()!如果每个onDraw请求另一个onDraw,则会导致出现无限循环。

  3. 如果您正在尝试实现帧动画,则应该在一个单独的线程中计算所有与帧相关的参数,这些参数会在更新之间等待一段时间,并且会在每一个之后调用onDraw他们。