【Android】画像をアニメーション表示するには

■ はじめに

https://dk521123.hatenablog.com/entry/2013/09/28/013815

の関連記事で行っている「画像を表示する」ことを応用して、
画像をアニメーション表示する

■ アニメーションのタイプ

* 2種類ある

1)Tweenアニメーション
2)Frameアニメーション

1)Tweenアニメーション

* 1つのイメージを連続に変化させる

2)Frameアニメーション

* 順番にイメージを並べて表示してアニメーションにする

■ サンプル

Java

 * 以下の画像ファイルをを「res/drawable」に入れておく
    + 「bg.jpg」(背景画像)
    + 「cloud.png」(背景・雲の画像)
    + 「player1.png」~「player5.png」(アニメーション用画像)

GameView.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        View view = new GameView(this);
        setContentView(view);
    }
}

MainActivity.java

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class GameView extends View {
    private Bitmap backGround;
    private List<Bitmap> players;
    private int index;
    private int cloudX = 0;
    private int cloudY = 0;
    private int cloudVX = -2;
    Paint paint;
    public GameView(Context context) {
        super(context);

        // 画像読み込み
        Resources resources = this.getContext().getResources();
        this.backGround = BitmapFactory.decodeResource(resources, R.drawable.bg);
        this.cloud = BitmapFactory.decodeResource(resources, R.drawable.cloud);
        this.players = new ArrayList<>();
        this.players.add(BitmapFactory.decodeResource(resources, R.drawable.player1));
        this.players.add(BitmapFactory.decodeResource(resources, R.drawable.player2));
        this.players.add(BitmapFactory.decodeResource(resources, R.drawable.player3));
        this.players.add(BitmapFactory.decodeResource(resources, R.drawable.player4));
        this.players.add(BitmapFactory.decodeResource(resources, R.drawable.player5));
        this.paint = new Paint();
        this.index = 0;
    }

    @Override
    public void onDraw(Canvas canvas) {
        this.backGround = Bitmap.createScaledBitmap(this.backGround,
                canvas.getWidth() * 2, canvas.getHeight(), true);
        canvas.drawBitmap(this.backGround, 0, 0, this.paint);

        // 画面(Canvas)中央のX座標を取得
        int canvasX = canvas.getWidth() / 2;
        // 画面(Canvas)中央のY座標を取得
        int canvasY = canvas.getHeight() / 2;

        // 雲の座標を「cloudVX」ずつ移動する
        this.cloudX += this.cloudVX;
        // 全体が画面から消える場合
        if (this.cloudX < -this.cloud.getWidth()) {
            this.cloudX = canvas.getWidth();
            this.cloudY = (int) Math.floor(Math.random() * canvasCY);
        }
        canvas.drawBitmap(this.cloud, this.cloudX, this.cloudY, this.paint);

        if (this.index >= this.players.size()) {
            this.index = 0;
        }
        Bitmap player = this.players.get(this.index);
        int x = this.canvasX - player.getWidth() / 2;
        int y = this.canvasY - player.getHeight() / 2;
        canvas.drawBitmap(player, this.x, this.y, this.paint);
        this.index++;

        // ループ処理
        this.invalidate();

        // スリープ処理
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
        }
    }
}

参考文献

http://boco.hp3200.com/game-devs/view/3.html
http://techbooster.jpn.org/andriod/ui/2018/

関連記事

画像を表示するには
https://dk521123.hatenablog.com/entry/2013/09/28/013815