事件的监听和处理

本教程介绍如何使用Android平台创建一个简单的键盘控制飞机移动的游戏应用。通过定义PlaneView组件,并为其实现键盘事件监听器,玩家可以使用WASD键来控制飞机在屏幕上移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.crazyit.ui.viewlistener;

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

/**
 * 作者:Gaao on 2016/6/5 19:52
 */
public class PlaneView extends View {

    public float currentX;
    public  float currentY;
    Bitmap bitmap;


    public PlaneView(Context context) {
        super(context);
        //定义飞机的图片
        bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.plane);
        setFocusable(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //创建画笔
        Paint paint = new Paint();
        //绘制飞机
        canvas.drawBitmap(bitmap,currentX,currentY,paint);
    }
}

该实例直接使用 planeView 作为 Activity 显示的内容,并为planeView增加键盘事件监听监听器.

处理View的 Activity

package com.crazyit.ui.viewlistener;

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

/**
 * 飞机游戏的 例子
 */
public class PlaneGameActivity extends Activity {

    //定义飞机移动的速度
    private int speed = 10;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉窗口的标题
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //全屏显示
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //创建planeView组件
        final PlaneView planeView = new PlaneView(this);

        setContentView(planeView);

        planeView.setBackgroundResource(R.drawable.back); //设背景

        //获取窗口管理器
        WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
      final   DisplayMetrics metrics = new DisplayMetrics();

        //获得屏幕的宽和高
        display.getMetrics(metrics);

        //设置飞机的初始位置
        planeView.currentX = metrics.widthPixels / 2;
        planeView.currentY = metrics.heightPixels - 40;

        //为 planeView 组件添加 键盘监听事件
        planeView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                //获取是由哪一个键 触发的事件
                switch (event.getKeyCode()) {
                    //控制飞机下移
                    case KeyEvent.KEYCODE_S:
                        planeView.currentY += speed;
                        if (planeView.currentY>metrics.heightPixels){
                            planeView.currentY=metrics.heightPixels-50;
                        }
                        break;
                    //控制飞机上移
                    case KeyEvent.KEYCODE_W:
                        planeView.currentY -= speed;
                        if (planeView.currentY<0){
                            planeView.currentY=0;
                        }
                        break;
                    //控制飞机左移
                    case KeyEvent.KEYCODE_A:
                        planeView.currentX -= speed;

                        if (planeView.currentX<0){
                            planeView.currentX=0;
                        }
                        break;
                    //控制飞机右移
                    case KeyEvent.KEYCODE_D:

                        planeView.currentX += speed;

                        if (planeView.currentX>metrics.widthPixels){
                            planeView.currentX=metrics.widthPixels;
                        }
                        break;

                }

                //通知 planeView 组件重绘
                planeView.invalidate();
                return true;
            }
        });

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值