基于Java语言的安卓编程之十九按键事件监听(上)

时间:2022-06-19 00:22:40

前一天学习了Spinner控件的使用方法。Spinner控件的数据可以在values资源中指定,也可以通过适配器指定。在values资源中指定时,通过entries属性指定集合资源,使用适配器指定数据时,可以自定义BaseAdapter类的对象,在该对象中设置Spinner控件列表项的布局。

今天将学习按键事件监听的实现。主要通过一个控制球员头像位置的程序实现,如图1所示。当按下模拟设备键盘的S、W、A和D键后,球员头像可以向上、下、左、右进行移动。

基于Java语言的安卓编程之十九按键事件监听(上)

图1 通过按键控制球员头像位置

通过为应用程序的视图添加按键事件监听器来实现以上功能。当为视图添加了按键事件监听器之后,当用户按下了指定了按键,安卓系统将创建按键事件对象,并将该事件对象传递给事件监听器,由事件监听器调用相应的事件处理器进行处理。

1 应用程序视图的新建

为了实现以上功能,要为应用程序创建新的视图。新建一个名为PlayerPosition的程序,在“PlayerPosition->src->com.example.PlayerPosition”的包的右键菜单中选择“New->Class”,为应用程序添加一个新的视图类。在弹出的“NewJava Class”对话框中,将新添加的类名称设置为PlayerView,并且将其“Superclass”设置为“android.view.View”,如图1-1所示。

基于Java语言的安卓编程之十九按键事件监听(上)

图1-1 添加PlayerView类

1.1 定义类的变量

在PlayerView.java文件的PlayerView类的定义中,为该类定义三个变量

    publicfloatcurrentX;

    publicfloatcurrentY;

    Bitmap player;

其中,currentX和currentY表示球员头像位置的横坐标和纵坐标;player表示球员头像的图像。

1.2 定义类的构造函数

在定义了类的变量之后,接下来定义类的构造函数。

1   public PlayerView(Context context)

2   {

3      super(context);

4      player = BitmapFactory.decodeResource(

5             context.getResources()

6             ,R.drawable.player);

7      setFocusable(true);

8      setBackgroundResource(R.drawable.back);

9   }

其中,第3行表示调用基类,即View类的构造函数;第4-6行的作用是获取指定图像,BitmapFactory类的全称是android.graphics.BitmapFactory,它直接派生自java.lang.Object,用来从文件(file)、流(stream)或者字节数组(byte-array)中创建位图,decodeResource()是该类的一个方法,该方法的格式为

publicstatic Bitmap decodeResource(Resources res, int id)

其中,参数res表示包含图像数据的资源对象,id表示图像数据的ID,返回值是Bitmap类的对象,表示从指定的资源中解码(decode)后获得的图像。因此,第5行表示包含球员头像图像的资源,context是PlayerView类构造函数的参数,表示本应用程序的上下文。通过该上下文调用的方法getResources()的作用就是获取本应用程序的资源对象;第6行表示球员头像图像的ID,可以将球员头像拷贝到PlayerPosition->res-> drawable-hdpi”中。第7行中调用View类的方法setFocusable()将本视图设置为可以接受焦点,该方法的参数为true是表示可以接受焦点,为false时表示不能接受焦点;第8行调用View类的方法setBackgroundResource()来设置该视图的背景,其中R.drawable.back表示球场图像,将该图像拷贝到“PlayerPosition->res->drawable-hdpi”中。

1.3 重载类的onDraw()方法

使用一个新视图时,需要重载该视图的一些标准的方法,而这些重载的方法都是安卓系统要调用的。其中最常见的是重载视图的onDraw()方法。当视图需要重新绘制时,就要调用该方法,该方法的格式为

onDraw(android.graphics.Canvas)

其中,参数Canvas类用来进行“绘画”操作,canvas的意思是“画布”,该类主要完成画布的功能。

重载PlayerView类的onDraw()方法的代码为

1   publicvoid onDraw(Canvas canvas)

2   {

3      super.onDraw(canvas);

4      Paintp = new Paint();

5      canvas.drawBitmap(player,currentX,currentY, p);

6   }

其中,第3行调用了其基类即View的onDraw()方法;第4行通过new关键字定义了Paint类的对象,Paint类的全称是android.graphics.Paint,直接派生自java.lang.Object。该类用来指定要画的文字、图像或者形状的方式和颜色信息。第5行通过canvas调用drawBitmap()方法在指定位置出将球员头像画出来,该方法的格式为

publicvoid drawBitmap (Bitmap bitmap,float left, float top, Paint paint)

其中,参数bitmap表示要画的图像,left和top表示从哪个位置(左上角横纵坐标)开始画图像,paint表示用来画图像的颜料。

2 新建视图的应用

在创建了新的视图之后,接下来就要把该新视图用于应用程序中。在MainActivity.java的MainActivity类的onCreate()方法定义中,首先注释掉自带的指定视图的代码

//setContentView(R.layout.activity_main);

之后,通过new关键字新建自定义的视图,并将该视图用在应用程序中

        final PlayerView playerView =new PlayerView(this);

       setContentView(playerView);