画面への変更は、メイン スレッドまたは runOnUiThread を介して行う必要があります。
runOnUiThread(new Runnable() {
public void run() {
/////your code here
}
});
sleep(1000,0) を追加し、呼び出し間の経過時間を確認して固定レートにすることができます。
public class MyUpdater extends Thread
{
long milis;
long nanos;
private ArrayList<Updatable> updatables;
public MyUpdater(long milis,long nanos)
{
super();
this.milis=milis;
this.nanos=nanos;
updatables=new ArrayList<Updatable>();
}
public void run()
{
runOnUiThread(new Runnable() {
public void run() {
long previousTime=System.nanoTime();
while(true)
{
sleep(milis,nanos);
long now=System.nanoTime();
long elapsedTime=previousTime-now;
previousTime=now;
update(elapsedTime);
}
}
});
}
public synchronized void addUpdatable(Updatable object)
{
updatables.add(object);
}
public synchronized void removeUpdatable(Updatable object)
{
updatables.remove(object);
}
private synchronized void update(long elapsedTimeNanos)
{
for(Updatable object: updatables)
{
object.onUpdate(elapsedTimeNanos);
}
}
}
ここで、Interface または基本の Updatable クラスが必要になります。
public Interface Updatable
{
public void onUpdate(long elapsedTimeNanos);
}
そして例
public class MyJozanClass implements Updatable()
{
private float adjuster=0.00002f; ////you will have to adjust this depending on your ///times
float x=0;
float y=0;
public MyJozanClass()
{
}
public void onUpdate(long elapsedTimeNanos)
{
float newX=x+adjuster*elapsedTimeNanos;
float newY=y+adjuster*elapsedTimeNanos;
//////change positions
}
}
一般に、このソリューションは AndEngine システムによく似ています。