我已经学习了将近一个月的android,我想用一个从View扩展的自定义类来制作一个简单的游戏,它包含在main_activity.xml中。在Main Activity.class中,我创建了一个View实例,并使用按钮控制精灵在GameView上的移动,因此每个按钮都有一个控制精灵运动的方法,如下所示:
public void move_up(View v){
gameview.sprite.move(Dir.UP);}
问题是它只在释放按钮时有效,并且执行一次。我希望在按下按钮时执行该方法,但我无法弄清楚如何执行此操作。
答案 0 :(得分:0)
我假设你的方法名称是为了处理事件而将onClick
属性添加到xml布局文件中。虽然这看起来很方便但它不会给你你所需要的东西。
相反,您应该实施OnTouchListener
,它会为您提供有关当前正在发生的触摸事件的信息,在您要处理ACTION_DOWN
操作的情况下:
findViewById(R.id.btn_up).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
gameview.sprite.move(Dir.UP); //Or whatever
return true; //In case you wan to handle ACTION_UP
}
return false;
}
});
虽然您可以让Activity
实现侦听器并在那里处理多个按钮。这可以通过告诉您的活动实施OnTouchListener
,实现方法onTouch
,如上面的代码,而不是作为您的活动方法来实现。
结果集将简化为findViewById(R.id.btn_up).setOnTouchListener(this);
,其中R.id.btn_up
是您在xml文件中定义的ID。
这会让它在按下时开始移动,而不是在它们释放时开始移动,如果你想要的是让它移动直到它们释放(这将是有意义的),做类似的事情:
if(event.getAction() == MotionEvent.ACTION_DOWN){
gameview.sprite.move(Dir.UP); //Or whatever
return true; //In case you wan to handle ACTION_UP
}else
if(event.getAction() == MotionEvent.ACTION_UP){
gameview.sprite.stop(); //Or whatever you call the stop method
return false;
}