android - 在 Android Canvas 下动画形状的最佳实践

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

我有一个自定义 View ,它绘制了几个圆圈和大约 10 个不断更新(旋转和大小变化)的拱门。我正在尝试为整个过程制作动画,但我找不到在 Canvas 下这样做的任何好的做法(我知道基础知识 - 使用 dp 而不是 px 等等),但我不知道如何正确地做动画部分。

现在我正在遍历所有对象,执行一些计算以确定 future 位置并绘制它们,但它看起来很不稳定。这是我目前正在做的事情:

@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. 您不应在自定义 View onDraw 中执行任何繁重 操作。这是为 android 开发的一个非常重要的原则!理想情况下,您应该只在 onDraw 方法中绘制。有时您需要基于 Canvas 进行计算,但您应该将此类操作限制在最低限度。您可以在其他地方(不是在 onDraw 中)预先分配和计算的所有内容,都应该从您的 onDraw 中提取。在你的情况下 arch.update() (我假设计算动画的下一个“帧”)和你的 textXtextY 的计算应该搬到别处去。

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

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

关于android - 在 Android Canvas 下动画形状的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36115627/

相关文章:

android - 创建 apk 文件时我应该选择多少支持的架构

android - 动画 : Move TextView into another container

Android - 如何将一条路径叠加在另一条路径之上

android - 2D游戏动画android

android - 你知道一个好的android渲染引擎吗?

android - 如何从服务转到主屏幕?

android - 单击更改 TextView 背景颜色

android - 动画没有按预期工作

android - Android 中的 3D 立方体过渡 - 完整代码示例

java - 如何在 android 的 Canvas 上绘制多段线?