使用onDraw或ImageView进行Android动画?

时间:2013-02-14 17:49:32

标签: android animation rotation imageview ondraw

我想创建一个Android游戏。每当有人触摸显示器时,玩家应该上升,如果他释放,则玩家应该跌倒。

在许多教程的帮助下,我让它发挥作用,但现在我想要制作它的动画而且我被卡住了。这意味着玩家的图像应该每半秒更换一次。另外,当玩家上升时应该创建动画旋转。

但是(谷歌搜索后几小时)我找不到任何有用的答案来解决我的问题。 Android Developers网站讨论了如何创建ImageView和XML文件。但那就是我被困住的地方:我没有ImageView,我的播放器(我使用的是PNG文件)只是由onDraw()方法创建的:

public void onDraw(Canvas canvas) {
       for (Sprite s : sprites) {   
            canvas.drawBitmap(s.getGraphic(), s.getLocation().x,
                    s.getLocation().y, null);

        }
}

现在我想问一下我应该怎么做动画和动画旋转。我应该从ImageView开始,还是可以以某种方式将onDraw方法“转换”为ImageView?或者是否有其他方法可以在没有ImageView的情况下进行动画和动画旋转?

其次,如果我必须创建ImageView,我不明白如何让玩家“动态”,即:当有人触摸显示器时改变位置。

提前致谢:)

编辑:

好的,我在drawable文件夹中创建了我的animation.xml文件:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" android:id="@+id/splashAnimation">
<item android:drawable="@drawable/ship" android:duration="200" />
<item android:drawable="@drawable/ship_2" android:duration="200" />
</animation-list>

在我的主文件中我添加了:

ImageView img = (ImageView) findViewById(R.id.splashAnimation);
    img.setBackgroundResource(R.drawable.animation);
    ship_anim= (AnimationDrawable) img.getBackground();
ship_anim.start();

但是,现在我收到错误消息:NullPointerException

问题出在哪里?

1 个答案:

答案 0 :(得分:0)

如果您有描述动画的drawable,您可以像这样在drawable文件夹中创建xml,而不是将其作为imageView添加到布局

    <?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/img1" android:duration="100" />
<item android:drawable="@drawable/img2" android:duration="100" />
<item android:drawable="@drawable/img3" android:duration="100" />
<item android:drawable="@drawable/mimg4" android:duration="100" />
<item android:drawable="@drawable/img5" android:duration="100" />   
</animation-list>

它的代码如下所示:

myAnimation = (AnimationDrawable) findViewById(R.id.animation);

只添加事件处理程序而不是

if (!isPlaying)
{
playDrawableAnimation();
    isPlaying = true;
} else
{
    faceAnimation.stop();
    isPlaying = false;

}