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

时间:2010-04-13 06:50:44

标签: android user-input

我以为自己已经理解了这个问题,但这里有些不对劲。当用户(我,到目前为止)试图按键时,没有任何事情发生,我很难理解我错过了什么。

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

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

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

另请注意,Graphics中的GraphicsThread成员称为“thread”,而GraphicsThread中的SurfaceHolder成员称为“mSurfaceHolder”。

所以在类Graphics:

中考虑这个方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
    return thread.keyDownHandler(keyCode, msg);
}

另外请在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;
}

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

谢谢!

2 个答案:

答案 0 :(得分:1)

在我担心实际运动之前,我会考虑Log ...

类似的东西:

Log.d("lunar", "keyCode = ["+String.valueOf(keyCode)+"] // msg = ["+String.valueOf(msg)+"]");

在这样做之前,我可以先了解一下系统注册的内容,然后再担心我对所述注册数据的处理方式......之后你就可以决定是否发送了正确的东西然后担心关于线程工作等。

希望这可以帮助诊断等(所有这些都是徒手写的,可能包含错误)

答案 1 :(得分:0)

扔掉LunarLander并使用真实指南:Playing with graphics in Android