您对屏幕的更改必须在主线程中或通过 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 系统。