3

我一直在搞乱Snake示例代码,我正在尝试修改它以进行培训,并希望增加对 Android 工作原理的理解。

到目前为止,我已经添加了两个按钮 + 相应的 setOnClickListener 代码,如下所示。

蛇布局.xml

          <Button
         android:layout_height="39px"
         android:layout_width="55px" 
         android:layout_marginLeft="15px"
         android:text="Left"
         android:id="@+id/left_button" />

      <Button
         android:layout_height="39px" 
         android:layout_width="55px" 
         android:layout_marginLeft="240px"
         android:text="Right"
         android:id="@+id/right_button" />

Snake.java

.
.
.
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // No Title bar
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.snake_layout);

    final Button leftButton = (Button) findViewById(R.id.left_button);
    leftButton.setOnClickListener(new Button.OnClickListener() {  
        public void onClick(View v)
            {
                //perform action
            }
         });

    final Button rightButton = (Button) findViewById(R.id.right_button);
    rightButton.setOnClickListener(new Button.OnClickListener() {  
        public void onClick(View v)
            {
                //perform action
            }
         });
.
.
.

当我尝试一种简单的方法(例如“ finish() ”)时,这两个按钮都会显示在它们应该出现的位置并起作用。

现在,我想做的是让这些按钮在SnakeView.java中触发下面的代码:

        if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
        if (mDirection != EAST) {
            mNextDirection = WEST;
        }
        return (true);
    }

    if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
        if (mDirection != WEST) {
            mNextDirection = EAST;
        }
        return (true);
    }

为了清楚起见,我需要让我的自定义屏幕按钮执行与当前代码中的“KEYCODE_DPAD_RIGHT”和“KEYCODE_DPAD_LEFT”相同的工作。我的 Xperia X10i 没有配备 DPAD,这是它的一部分;-P

我真的很感激一些正确方向的指示。正如您可能已经猜到的那样,我对此很陌生..

提前谢谢各位

4

3 回答 3

2

在这里检查:

以编程方式投掷/模拟按键

基本逻辑隐藏在后面:

private void doInjectKeyEvent(KeyEvent kEvent) {
    try {
        /* Inject the KeyEvent to the Window-Manager. */
        windowManager.injectKeyEvent(kEvent.isDown(), kEvent.getKeyCode(),
            kEvent.getRepeatCount(), kEvent.getDownTime(),
            kEvent.getEventTime(), true);
    } catch (DeadObjectException e) {
        e.printStackTrace();
    }
}
于 2011-05-26T14:11:28.093 回答
2

代替// perform action您的onClick方法,从现有代码中复制适当的主体(例如,if (mDirection != EAST) mNextDirection = WEST;)。

顺便说一句,以像素为单位指定按钮尺寸被认为是不好的做法。这不适用于旨在在可能具有非常不同的像素密度和屏幕尺寸的设备上运行的代码。最好让按钮根据它们包含的内容自行调整大小。

于 2011-05-26T14:13:42.647 回答
0

您需要在 SnakeView.java 中创建一个允许您更改 mNextDirection 的函数。

public void setMNextDirection(int direction){
  //check if the direction is recognised
  if (direction == EAST || direction == WEST ) { 
    mNextDirection = direction;
  }

之后,您可以使用:

mSnakeView.setMNextDirection(mSnakeView.WEST);
于 2011-05-26T14:17:32.083 回答