2017-12-22 11 views
2

imageViewをx回移動する関数を実行しようとしています。これはウォーキングアニメーションです。関数を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ミリ秒ごとに実行されるのに対し、何回か呼び出されるようです。私は、たとえ異なった例をたくさん見ても、私が間違っていることを知らない。

答えて

2

thisによると、使用しているスケジュールのオーバーロードはvoid schedule(TimerTask task, long delay)なので、タスクの実行を遅延させるだけですが、定期的に実行するのではありません。定期的に何かを実行するようにタイマーをスケジュールするには、void schedule(TimerTask task, long delay, long period)を使用する必要があります。

だから、のようなものでなければなりません:

timer.schedule(timerTask, 0, 300);

1

は、タスクを1回だけ実行し、タスクは300ミリ秒で実行されます。

は、実行を繰り返すために、あなたは使用する必要があります。 期間が実行間の遅延がある

void schedule (TimerTask task, Date firstTime, long period)

timer.schedule(timerTask, 300, 100);は、300ミリ秒で初めてタスクを実行し、その後、タスクは100ミリ秒ごとに起動します。

+1

はご回答いただきありがとうございます何らかの理由で私のコードはまだ1回しか実行されません。私は別の問題があると思う –

0

これにはAsyncTaskを使用することもできます。 は、インスタンスを作成し、AsyncTaskを実行)(doWalkに続いて

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)); 
    } 
} 

(ImageViewの(S)クラス変数を作る)に同一の活性クラス内AsyncTaskを拡張:

MoveTask moveTask=new MoveTask(); 
MoveTask.execute(); 
関連する問題