前一天学习了Spinner控件的使用方法。Spinner控件的数据可以在values资源中指定,也可以通过适配器指定。在values资源中指定时,通过entries属性指定集合资源,使用适配器指定数据时,可以自定义BaseAdapter类的对象,在该对象中设置Spinner控件列表项的布局。
今天将学习按键事件监听的实现。主要通过一个控制球员头像位置的程序实现,如图1所示。当按下模拟设备键盘的S、W、A和D键后,球员头像可以向上、下、左、右进行移动。
图1 通过按键控制球员头像位置
通过为应用程序的视图添加按键事件监听器来实现以上功能。当为视图添加了按键事件监听器之后,当用户按下了指定了按键,安卓系统将创建按键事件对象,并将该事件对象传递给事件监听器,由事件监听器调用相应的事件处理器进行处理。
1 应用程序视图的新建
为了实现以上功能,要为应用程序创建新的视图。新建一个名为PlayerPosition的程序,在“PlayerPosition->src->com.example.PlayerPosition”的包的右键菜单中选择“New->Class”,为应用程序添加一个新的视图类。在弹出的“NewJava Class”对话框中,将新添加的类名称设置为PlayerView,并且将其“Superclass”设置为“android.view.View”,如图1-1所示。
图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);