在Android中处理精灵表动画

4

我进行了很多研究,但是我找不到一个明确的例子来将精灵表渲染成动画。我有这个精灵表:

enter image description here

我会非常感激提供一个加载此图像的高效示例代码。


可能是程序化切割雪碧图的最佳实践的重复问题。 - Phantômaxx
我可以问一下您是否正在开发像游戏这样图形密集型的应用程序吗?如果是,我的第一个建议是完全切换到像LibGDX或ANDengine这样的游戏引擎。 - Kasra
2个回答

7
这个做法非常简单。在开始编码之前,您需要将精灵分解成不同的图像文件,每个文件代表动画中的一帧。 注:您可以通过代码实现上述操作,但这是另一个问题。
1. 现在您需要创建一个 XML 文件,它将成为您的动画。 XML 文件将位于 res/drawable 目录下。
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
    <item android:drawable="@drawable/exp0" android:duration="100"/>
    <item android:drawable="@drawable/exp1" android:duration="100"/>
    <item android:drawable="@drawable/exp2" android:duration="100"/>
    .
    .

每个项目代表一个帧(按顺序)- exp0 是第一个帧,exp1是第二个帧,依此类推。

android:oneshot="true"

这将使您的动画循环一次,然后保留最后一帧显示。其余代码非常简单易懂(持续时间以毫秒为单位)。

2. 您需要将xml文件分配给一个View并启动它。

假设我们希望在网格中的“tileView”对象上显示此动画(可以将其应用于任何View)。

    tileView.setImageResource(R.drawable.explosion_animation);
    AnimationDrawable explosionAnimation = (AnimationDrawable)tileView.getDrawable();
    explosionAnimation.start();

我们所做的是将我们的动画XML设置为ImageResource(爆炸动画是我们创建的XML文件), 然后我们将动画本身获取到一个AnimationDrawable对象中。 最后,我们启动动画。

4
您可以将精灵存储为Rect数组。
Rect[] frames = new Rect[TOTAL_NUMBER_OF_FRAMES];

您的表格似乎具有等距精灵,因此您可以使用嵌套的for循环来数学地填充数组。(注意,您可能需要设置BitMapFactory选项以不缩放位图)。

您可以使用以下方法绘制第n帧:

canvas.drawBitmap(bmp, frames[n],
    new RectF(x, y, x + frames[n].width(), y + frames[n].height()),
    paint);

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