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

7
我以为我理解了这个问题,但是有些地方似乎出了问题。当用户(也就是我)尝试按键时,什么都不会发生,我很难理解我错过了什么。
在我展示一些代码来帮助澄清我的问题之前,请考虑以下内容:我正在使用Android的Lunar Lander示例制作我的第一个“真正”的Android程序。在那个例子中,当然存在一个名为LunarView的类,以及嵌套在其中的LunarThread类。在我的代码中,这些类的等效物分别为Graphics和GraphicsThread。
此外,我可以在Android上很好地制作2D精灵动画。我有一个Player类,假设GraphicsThread具有称为“player”的Player成员。这个类有四个坐标 - 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:Left时,他为什么不会做出任何不同的反应?

谢谢!


2
设置一些断点,确保您到达了设置玩家位置的代码行。如果值被设置了,那么很可能是在位置设置后没有调用绘制方法。如果没有,则要么检查错误的键代码,要么存在线程问题。 - Dave.B
1
你确定你正在适当地重绘画布吗?调用invalidate()来强制绘制视图。 - YGL
2个回答

1
在考虑实际运动等问题之前,我会先考虑日志记录之类的东西...
类似这样:
Log.d("lunar", "keyCode = ["+String.valueOf(keyCode)+"] // msg = ["+String.valueOf(msg)+"]");

这样做可以让我感受到系统在注册数据之前的情况,而不必担心如何处理已注册的数据...之后,您可以决定是否发送正确的内容,然后再考虑线程工作等问题。
希望这可以帮助诊断等问题。(所有内容均为手写,可能包含错误)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接