我正在尝试运行一个函数来移动imageView x次。这是一个步行动画。
public void doWalk() {
String mDrawableName = buddy.leraar.naam;
if (buddy.gezondheid < 30)
{
mDrawableName += "_dik_lopen";
}
else if (buddy.gezondheid > 85)
{
mDrawableName += "_dun_lopen";
}
else {
mDrawableName += "_medium_lopen";
}
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
imageView.setImageResource(resID);
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
executeWalk(rnd.nextInt(1));
};
};
timer.schedule(timerTask, 300);
}
public void executeWalk(int left) {
if (rolls < 10)
{
rolls++;
if (left == 0)
{
imageView.setX(imageView.getLeft() - 10);
}
else {
imageView.setX(imageView.getLeft() + 10);
}
}
}
由于某种原因,executeWalk函数似乎只被调用一次,而它应该每300毫秒运行一次。即使看了很多不同的例子,我也不知道我做错了什么。
答案 0 :(得分:3)
尝试使用schedule (TimerTask task, long delay, long period)。问题是你只能延迟300ms启动你的功能一次。
timer.schedule(timerTask, 0, 300);
答案 1 :(得分:2)
根据this,您使用的计划重载是layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
out vec2 TexCoord;
uniform mat4 MVP;
void main() {
gl_Position = MVP * vec4(aPos, 1.0);
TexCoord = aTexCoord;
}
,因此您只是推迟执行任务但不定期执行任务。您应该使用void schedule(TimerTask task, long delay)
来安排定时器定期执行某些操作。
所以它应该是这样的:
void schedule(TimerTask task, long delay, long period)
答案 2 :(得分:1)
timer.schedule(timerTask, 300);
只运行一次任务,任务将在300毫秒内运行。
要重复执行,您必须使用:
void schedule (TimerTask task, Date firstTime, long period)
期间是执行之间的延迟。
timer.schedule(timerTask, 300, 100);
将在300毫秒内第一次运行任务,之后任务将每100毫秒启动一次。
答案 3 :(得分:0)
你也可以使用AsyncTask。 在同一活动类中扩展AsyncTask(使imageview成为类变量)
public class MoveTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... voids)
{
while(1) {
delay(300);
publishProgress();
}
}
@Override
protected void onProgressUpdate(Void... voids)
{
//Move the imageview here
executeWalk(rnd.nextInt(1));
}
}
然后在doWalk()中创建一个实例并执行AsyncTask:
MoveTask moveTask=new MoveTask();
MoveTask.execute();