我目前正在制作Android游戏,我希望能够使用相机按钮进行拍摄(或者我不介意使用不同的硬件按钮,只需点击屏幕就会变成垃圾)。
在我看来,我有:
public class GameFrame extends SurfaceView implements SurfaceHolder.Callback, OnKeyListener{
public GameFrame(Context context){
...
setOnKeyListener(this);
...
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN)
{
shoot();
return true;
}
return false;
}
}
然而,这并没有做任何事情,即使我疯狂地击中手机上的所有按键,也从未调用过shoot()! 是否有一些我错过的东西,或者我完全错了?
干杯
答案 0 :(得分:2)
您的代码是正确的,并且侦听器已正确连接到SurfaceView。这里的问题有点误解:
将OnKeyListener
附加到View
时,仅当特定视图聚焦时,侦听器 才会收到关键事件。如果活动中存在多个视图,则必须区分关键侦听器。很可能你的观点并不专注于创业。
您可以将视图集中在我强烈建议的代码中,因为如果您有其他视图,用户可能会意外清除焦点。以下是一个小代码片段,您的代码必须如何更改,仅供参考/理解:
public class GameFrame extends SurfaceView implements SurfaceHolder.Callback, OnKeyListener{
public GameFrame(Context context){
...
setOnKeyListener(this);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
...
}
....
}
更好的替代方式的方式是获取您的活动中的所有关键事件,而不管哪个视图是关注的。这可以通过覆盖活动onKeyDown()
方法来完成。在您的活动中添加以下内容:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN)
{
shoot();
return true;
}
return false;
}
答案 1 :(得分:1)
//This 'called' your layout, you could access elements of your layout
setContentView('R.layouts.name_layout');
// You call the button you're interested in
Button btn = this.findViewById(R.your_button_in_layout);
btn.setOnClickListener(this);
使用onClick方法更容易理解,但OnKeyListener方法也是如此。 看看:http://www.androiddevelopment.org/category/code-examples/
答案 2 :(得分:0)