Android 自定义 View 之移动游戏背景

借助于 Bitmap 的 createBitmap 方法可以”挖取“源位图的其中一块,这样可以在程序中通过定时器控制不断地”挖取“源位图不同位置的块,从而给用户看到背景移动的”假象“。

假设要开发经典“雷电”飞机游戏,为了给客户一个飞机在不断飞行的感觉,可以通过在这种方式来控制背景图片不断下移,这时用户就会感觉飞机在不断向上飞行。

下面是一个简单的示例程序:

package com.toby.personal.testlistview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

    final private static String TAG = "Toby_Test";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new TestView(this));
    }

    class TestView extends View {

        final int BACK_HEIGHT = 1720;

        private Bitmap back;
        private Bitmap plane;

        final int WIDTH = 320;
        final int HEIGHT = 440;
        private int startY = BACK_HEIGHT - HEIGHT;

        public TestView(Context context) {
            super(context);
            back = BitmapFactory.decodeResource(context.getResources(), R.drawable.bg_long);
            plane = BitmapFactory.decodeResource(context.getResources(), R.drawable.plane);

            final Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    if (msg.what == 170416) {
                        if (startY <= 0) {
                            startY = BACK_HEIGHT - HEIGHT;
                        } else {
                            startY -= 3;
                        }
                    }
                    invalidate();
                }
            };

            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    handler.sendEmptyMessage(170416);
                }
            }, 0, 100);

        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawColor(Color.GRAY);
            Bitmap bitmap = Bitmap.createBitmap(back, 0, startY, WIDTH, HEIGHT);
            canvas.drawBitmap(bitmap, 0, 0, null);
            canvas.drawBitmap(plane, 100, 320, null);
        }
    }

}

该测试示例的运行效果:

plane

本文参考文献:《疯狂Android讲义 : 第2版

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容