这很可能是一件微不足道的事情,但我无法找到解决方案。 事情很简单,用户按下屏幕,当他将手指放在屏幕上时,我想要一段代码来执行。
以下是代码示例:
@Override
public boolean onTouchEvent(MotionEvent event) {
synchronized (getHolder()) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
myobject.setX(myobject.getX() - 10);
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
} else if (event.getAction() == MotionEvent.ACTION_UP) {
}
return true;
}
}
这段代码的效果是myobject.setX()只发生一次,我希望它在用户将手指放在屏幕上时不断重复,所以如果它保持3秒钟,myobject.setX()会几次减少-10次。
答案 0 :(得分:1)
您可以使用布尔变量(在ACTION_DOWN上指定为true)来指示您仍然按下屏幕,当您举起手指(ACTION_UP)时,将其设置为false,因此在此期间您可以启动一个Thread在你想要的时间执行你的代码,如下所示:
private boolean mIsStillPressing;
@Override
public boolean onTouchEvent(MotionEvent event) {
synchronized (getHolder()) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mIsStillPressing = true;
new Thread() {
@Override
public void run() {
// Still moving object until an ACTION_UP is done.
while (mIsStillPressing) {
myobject.setX(myobject.getX() - 10);
// Some sleep time
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
} else if (event.getAction() == MotionEvent.ACTION_UP) {
mIsStillPressing = false;
}
return true;
}
}`
答案 1 :(得分:0)
public boolean onTouchEvent(MotionEvent event)
中提供的MotionEvent仅与初始触摸的MotionEvent.ACTION_DOWN
匹配。您需要在else if语句中继续更新:(event.getAction() == MotionEvent.ACTION_MOVE)
。
答案 2 :(得分:0)
你可以这样做(例子):
int howLongUntilEdge = 1000;
CountDownTimer t = new CountDownTimer(howLongUntilEdge, 1000) {
@Override
public void onTick(long millisUntilFinished) {
myobject.setX(myobject.getX() - 10);
}
@Override
public void onFinish() {}
};
然后是你的触摸事件:
@Override
public boolean onTouchEvent(MotionEvent event) {
synchronized (getHolder()) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
t.start();
} else if (event.getAction() == MotionEvent.ACTION_UP) {
t.stop();
}
return true;
}
}
它会每秒向左移动10。您需要做一些事情,比如决定它到达边缘的秒数,并设置howLongUntilEdge
var以反映正确的值