2013-05-12 91 views
1

我在Eclipse中使用了Android开发人员工具,使用Java进行编程,只要按下按钮,我需要使对象在屏幕上移动。我一直在研究几个小时,而且我找不到任何方法来完成这个任务。我试过运行的线程,它经常崩溃或看似不执行。我也尝试了一个onClickListener,它读取按钮状态并使用它来确定按钮是否仍然按下。我目前正在使用while循环,但这只是冻结了程序。我相信这是最好的方法,并且我试图使用Thread.sleep来限制每秒的迭代次数,因为我认为这是它冻结的原因。我在正确的轨道上还是我在左边的路上?下面是一个代码片段:如何在按下按钮时使一段代码循环,并在按钮不再按下时停止它?

rightButton.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View arg0) 
     { 
      while(arg0.isPressed()) 
      { 
       mover.updateCoordinates(1, 0); 
      } 
     } 

    }); 
+0

究竟崩溃,请发表logcat的也 – CRUSADER 2013-05-12 04:33:58

+0

你的按钮事件监听器中while循环的想法并不好。还原回旧的基于线程的代码,在此处发布代码并描述崩溃的位置/时间 – 2013-05-12 04:36:49

+0

在Android上,您也可以使用asysnc任务。你读过这篇文章吗? http://android-developers.blogspot.com/2009/05/painless-threading.html – 2013-05-12 04:39:16

回答

2

你会尝试这种方法吗?

首先声明你的按钮类变量,声明一个处理器和一个Runnable:

private Button rightButton; // You will assign this in onCreate() method 
private Handler mHandler = new Handler(); 
private Runnable mRunnable = new Runnable() { 
    @Override 
    public void run() { 
     if(rightButton.isPressed()) 
     { 
      // If press state is pressed, move your item and recall the runnable in 100 milliseconds. 
      mover.updateCoordinates(1, 0); 
      mHandler.postDelayed(mRunnable, 100); 
     } 
    } 
}; 

然后你的按钮的onClickListener会看起来像这样:

rightButton.setOnClickListener(new OnClickListener(){ 
    @Override 
    public void onClick(View arg0) 
    { 
     // Instead of performing a loop here, just call a runnable, do simple press state checking there. 
     mHandler.postDelayed(mRunnable, 100); 
    } 

}); 
+0

你也可以声明100毫秒作为一个类变量,调整它可以让你有不同的移动速度。 – 2013-05-12 04:57:51

+0

谢谢,Chor。你是个天才! – jaredad7 2013-05-12 05:02:56

+0

我实际上更喜欢接受我的回答,而不是“谢谢你”= / – 2013-05-12 05:05:04

0

创建一个循环,更新的意见,等待,并在等待结束后调用自身。在循环中,有一个动画if语句,其布尔型字段在true上移动并且不在false上移动。使用onClick方法切换布尔字段的值。

+0

我尝试了100毫秒的延迟,但当按下按钮时,应用仍然冻结。 – jaredad7 2013-05-12 04:48:20

0

尝试:

myView.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent e) { 
     if (e.getAction() == MotionEvent.ACTION_DOWN) { 
      // Start your animation here 
     } else if (e.getAction() == MotionEvent.ACTION_UP) { 
      // Stop your animation here 
     } 

     return false; 
    } 
}); 

参考文献:

MotionEvent

OnTouchListener

另外,覆盖onKeyUponKeyDownView类并检查KEYCODE_ENTERKeyEvent

+0

谢谢,但我大约两个小时之前就试过这个代码,并没有奏效。我用循环和调用线程来尝试它。 – jaredad7 2013-05-12 04:47:14

+0

@ jaredad7什么“不起作用”?你有没有尝试记录事件并看看发生了什么? – Tushar 2013-05-12 04:56:06

+0

@ jaredad7看看我的第二个建议,以覆盖'onKeyUp'和'onKeyDown'。 – Tushar 2013-05-12 04:58:38

相关问题