在Android中处理用户输入事件的基础是什么?

Pan*_*sis 7 android user-input

我以为我已经理解了这个问题,但这里有些错误.当用户(我,到目前为止)试图按键时,没有真正发生的事情,我很难理解我错过了什么.

在我提出一些代码以帮助澄清我的问题之前考虑一下:我使用Android的Lunar Lander示例来制作我的第一个"真正的"Android程序.当然,在那个例子中,存在一个类LunarView,并且类嵌套在LunarThread中.在我的代码中,这些类的等价物分别是Graphics和GraphicsThread.

另外,我可以在Android上制作2D精灵动画.我有一个Player类,让我们说GraphicsThread有一个玩家成员称为"玩家".该类有四个坐标 - x1,y1,x2和y2 - 它们定义了一个矩形,其中将绘制精灵.我已经解决了这个问题,所以我可以完美地处理它.每当调用doDraw(Canvas canvas)方法时,它只会查看这些坐标的值并相应地绘制sprite.

现在让我们说 - 这不是我正在尝试用程序做的事情 - 我正在尝试制作程序,其中所做的只是在屏幕的一个位置显示播放器精灵直到用户第一次按下Dpad的左键.然后,该位置将被更改为屏幕上的另一个设置位置,并且精灵将在该位置被绘制用于该程序的其余部分.

另请注意,Graphics中的GraphicsThread成员称为"thread",GraphicsThread中的SurfaceHolder成员称为"mSurfaceHolder".

所以在类Graphics中考虑这个方法:

@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
    return thread.keyDownHandler(keyCode, msg);
}
Run Code Online (Sandbox Code Playgroud)

另请在GraphicsThread类中考虑这个方法:

boolean keyDownHandler(int keyCode, KeyEvent msg) {
    synchronized (mSurfaceHolder) {
        if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
            player.x1 = 100;
            player.y1 = 100;
            player.x2 = 120;
            player.y2 = 150;
        }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

现在假设玩家的坐标开始为(200,200,220,250),当我按下Dpad时,他为什么不做任何不同的事情:左?

谢谢!

o0'*_*0'. 0

扔掉 LunarLander 并使用真正的指南:Playing withgraphics in Android