3应用程序窗口设置

对于本应用程序,需要不显示窗口标题,并且把窗口设置成最大化。

1   requestWindowFeature(Window.FEATURE_NO_TITLE);
    2   getWindow().setFlags(
    3          WindowManager.LayoutParams.FLAG_FULLSCREEN
    4          , WindowManager.LayoutParams.FLAG_FULLSCREEN);

其中,第1行代码的作用是不显示窗口标题,第2-4行代码的作用是使得窗口最大化。第1行中的requestWindowFeature()是Activity类的方法,该方法的作用是设置窗口的特性,Window.FEATURE_NO_TITLE是抽象类Window的常量,表示不显示窗口顶部的标题;第2行中的getWindow()方法是Activity类的方法,该方法的作用是获取当前视图的窗口,返回值是Window类的对象,通过获取到的Window类对象调用该类的setFlags()方法来设置应用程序窗口的属性,WindowManager.LayoutParams.FLAG_FULLSCREE表示应用程序的窗口最大化。

4 球员头像初始位置的确定

在设置了应用程序窗口的属性之后,接下来确定要显示的球员头像的初始位置,即PlayerView类的currentX和currentY变量。

在确定图像初始位置时,首先要获取设备屏幕的宽度和高度,之后根据设备屏幕的高度和宽度来这支图像的初始位置。

4.1 获取设备屏幕的大小

在MainActivity类的onCreate()方法中,有如下代码
1    WindowManager
    2   Displaydisplay = windowManager.getDefaultDisplay();
    3   int screenWidth = display.getWidth();
    4   int screenHeight = display.getHeight();

其中,第1行的作用是获取获取应用程序窗口的窗口管理器,getWindowManager()是Activity类的方法;第2行的作用是通过窗口管理器获取到应用程序窗口默认的显示对象,即Display类对象;第3-4行通过显示对象调用Display类的getWidth()和getHeight()方法获取应用程序窗口的宽度和高度。

4.2 指定球员头像的初始位置

接下来根据获取到的设备屏幕大小来指定球员头像的初始位置。

    playerView.currentX = screenWidth/2;

       playerView.currentY = screenHeight - 80;

其中,playerView是在2中创建的自定义视图的对象。

5 视图对于按键事件的监听

当用户按下模拟设备的按键时,自定义视图中的球员头像会相应移动。因此,需要对自定义视图添加事件监听器。在事件监听器中的事件处理器里,对按键信息进行相应处理。

5.1 添加按键事件监听器

在MainActivity类的onCreate()函数中,为自定义视图添加按键事件监听器。
playerView.setOnKeyListener(new OnKeyListener(){
........
}
);
5.2 重载按键事件处理器
在OnKeyListener()方法中,重载按键事件处理器,即onKey()方法。当焦点位于视图上时,点击设备按键就会调用该方法。
    @Override
           publicboolean onKey(View source, int keyCode, KeyEvent event)
           {
.......
         }
其中,参数source是焦点所在的视图,keyCode是所按下的按键,event是包含了事件信息的按键对象。
5.3 按键事件的处理
在重载的按键事件处理器onKey()中,对按键事件进行处理,从而判断出用户点击的是哪个按键,最后根据不同的按键进行不同的处理。
1             switch(event.getKeyCode())
2             {
3             case KeyEvent.KEYCODE_S:
4                 planeView.currentY += speed;
5                  break;
6                  case KeyEvent.KEYCODE_W:
7                 planeView.currentY -= speed;
8                  break;
9             case KeyEvent.KEYCODE_A:
10                planeView.currentX -= speed;
11                 break;
12            case KeyEvent.KEYCODE_D:
13                planeView.currentX += speed;
14                 break;
15              }
16               playerView.invalidate();
其中,第1行中通过KeyEvent类的对象event调用该类的getKeyCode()方法,获取按键事件对应的按键码(key code)。3-14行对按键码进行判断,KeyEvent.KEYCODE_S是KeyEvent类的常量,表示按键S,则对球员头像的纵坐标进行增加的处理,speed是增加的步进,在MainActivity类的onCreate()方法中定义:
private  int speed

同理,KeyEvent.KEYCODE_W、KeyEvent.KEYCODE_A、KeyEvent.KEYCODE_D表示按键W、A和D,分别对球员头像的纵坐标和横坐标进行处理。第16行通过自定义类的对象playerView调用该类的invalidate()方法,该方法使得整个视图失效,需要重画该视图。此时,会调用自定义视图的onDraw()方法,对球员头像进行重画,达到位置移动的效果。

6 小结

今天学习了视图按键事件的监听。首先新建了一个自定义的视图,在自定义视图中,重新编了其构造函数和onDraw()方法。之后将该视图用于应用程序,最后添加该视图的按键监听器,在监听器中对KeyEvent类型的参数进行处理,判断用户按下哪个按键,之后对球员头像的坐标进行处理,最后使得整个视图失效,重绘视图。