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



我有一个自定义视图,它绘制了几个圆圈和大约 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. 您不应该在自定义ViewsonDraw中执行任何繁重的操作。这是为Android开发的一个非常重要的原则!理想情况下,在您的onDraw方法中,您应该只绘制。有时您需要根据Canvas计算某些内容,但您应该将这些类型的操作限制在最低限度。您可以在其他地方(不是onDraw)预分配和计算的所有内容,您应该从onDraw中提取.在您的情况下,arch.update()(我假设计算动画的下一个"帧")和textXtextY的计算应该移动到其他地方。

  2. invalidate()基本上意味着您要求重绘View。重绘View时,将调用其onDraw。这就是为什么你真的不应该在你的onDraw里打电话给invalidate()!如果每个onDraw都请求另一个onDraw,它会导致一种无限循环的发生。

  3. 如果您尝试实现帧动画,则应在单独的线程中计算所有与帧相关的参数,该线程将在更新之间等待一段时间,并在每次更新后调用invalidate()

最新更新