在Android画布下,动画形状的最佳实践

3
我有一个自定义视图,绘制了几个圆和大约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个回答

3
你的代码有一些问题。
  1. 你不应该在自定义 ViewsonDraw 中执行任何 重型 操作。这是 Android 开发中非常重要的原则之一!理想情况下,在 onDraw 方法中,你应该只进行绘制操作。有时你需要根据 Canvas 计算某些值,但你应该尽量将这些操作限制在最小范围内。所有可以预先分配和计算的内容(不在 onDraw 中),都应该从 onDraw 中提取出来。在你的情况下,arch.update()(我假设它计算了动画的下一个“帧”)和计算 textXtextY 的操作应该移到其他地方。

  2. invalidate() 基本上意味着你请求重绘你的 View。当一个 View 被重绘时,它的 onDraw 将被调用。这就是为什么你不应该在 onDraw 中调用 invalidate()!如果每个 onDraw 都请求另一个 onDraw,会导致一种无限循环的情况发生。

  3. 如果你想要实现帧动画,你应该在一个单独的线程中计算所有与帧相关的参数,并等待更新之间的某个时间间隔,然后在每次更新后调用 invalidate()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接