そのようなカスタムObservableオブジェクトは、[オプションです]:
private final Observable mObservable = new Observable()
{
public void notifyObservers()
{
setChanged();
super.notifyObservers();
};
@Override
public void notifyObservers(Object data)
{
setChanged();
super.notifyObservers(data);
};
};
私はsetChanを呼び出すことができないからですObservableクラスの外側にあるged()は保護されています。変更されていなければ、オブザーバには通知されません。前に示したように
他の宣言は、今、私がどこかでこのTimeManager
を開始する必要があり、同じに保つ、私のアプリはライブ壁紙ですと私はThread
を拡張していますが、必ずしもそれを必要としないクラスにすべてのレンダリングのものを作ります
public void resumeDrawing()
{
if (!mTimeManagerRunning) // just a boolean field in my class
{
System.err.println("Resuming renderer."); // just for debug
mTimeManager.run();
mTimeManagerRunning = true;
}
else
{
System.err.println("Renderer already running."); // just for debug
}
}
をし、それはデュアルだ:私はこの1つはThread
クラスからpublic synchronized void start()
の私の@Override
で右後super.start();
と呼ばれ、この方法はresumeDrawing()
と呼ばれる作られた、この方法は、そのように見える
public void pauseDrawing()
{
if (mTimeManagerRunning)
{
System.err.println("Pausing renderer.");
mHandler.removeCallbacks(mTimeManager);
mTimeManagerRunning = false;
}
else
{
System.err.println("Renderer already paused.");
}
}
これで、時間マネージャを開始して停止できますが、誰が聞いていますか?誰もいない!それでははadd'emてみましょう:オブザーバーにあなたを追加する
@Override // from Observer interface
public void update(Observable arg0, Object arg1)
{
mElapsedMsRedraw += (Integer) arg1;
if (mElapsedMsRedraw >= mDrawingMsPerFrame)
{
mElapsedMsRedraw = 0;
drawEm(); // refresh the canvas and stuff
}
}
:私のレンダラのコンストラクタに私は私のmObservable
オブジェクト、それらの一つは、レンダラそのものなので、私のレンダラはThread
を拡張し、Observer
を実装するためにいくつかのObserver
秒を追加します単に行うmObservable.addObserver(THE_OBJECT - Implements Observer)
私はこのTimeManagerを使用するので あなたは、私は私のもの、私が通知さてるたびに再レンダリングされないことを確認することができ、それは相手のちょうど私が欲しいのオブジェクトの位置を更新するようCanvas
をリフレッシュよりも考えています内部的に描く
だから、描画を遅くする必要があるのは、時間が経過している間にオブジェクトが内部的に変化する方法を変更することです。あなたのサークルやポイントなどを意味します。
もっと明確でしたか?私はそれが助けて欲しい
thxしかし、より完全な例を投稿できますか?実装を表示します。 – FooBar
確かに、私は仕事中です。それは私が覚えているコードです。私は20分後に出発しますので、より完全なコードを提供します。 – HericDenis
Ok @FooBar今私は家にいますあなたを助けます(: – HericDenis