3

無効化を依頼した後、ビューの再描画が終了したら通知を受け取りたいのですが。この回答で述べたように、このinvalidate()メソッドはビューのUIをすぐには呼び出さずonDraw()、メインスレッドがアイドル状態になった後に実行されるメッセージキューで再描画をスケジュールします。

進行状況ダイアログを表示し、UIを変更して、ビューが正しく描画されたらダイアログを閉じたいと思います。ビューがいつ描画されたかを知るためにできるトリックはありますか?たぶん、ビューをサブクラス化して、onDraw()メソッドをオーバーライドすることによって?

4

2 に答える 2

5

あなたは自分で質問に答えたと思います。なぜだめですか:

public class DrawListenerView extends View{
    private Callback callback;
    public DrawListenerView(Callback callback){
        this.callback = callback;
    }

    @Override
    protected void onDraw (Canvas canvas){
        super.onDraw(canvas);

        //add your method here you want to call
        //Or use a Callback-pattern 
        callback.finish();
    } 
}

public interface Callback(){
    public void finish();
}

ソースを見ると:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/view/View.java#View.invalidate%28%29

上記のコメントは言う

ビュー全体を無効にします。ビューが表示されている場合、onDraw(android.graphics.Canvas)は将来のある時点で呼び出されます。これは、UIスレッドから呼び出す必要があります。>非UIスレッドから呼び出すには、postInvalidate()を呼び出します。

それを試してみてください :)

編集:おそらくこれを処理するためにコールバックを使用したいと思うでしょう。

于 2012-12-08T17:27:07.317 に答える
4

あなたはそれをすべて間違っているので、これをしようとするのは奇妙だと感じています。;)

何かが描画を終了するまでダイアログを閉じるのを待ちたいと言っています。これは、待機するのに十分な長さの描画操作があることを意味します。

onDrawでのフレームの描画は高速である必要があります。60 fpsを達成し、スムーズなUIを実現したい場合は、フレームあたり16ミリ秒であらゆる種類の入力処理と描画を実行できます。描画は、終了中に進行状況ダイアログを表示したいほど長くかかることはありません。(それとは別に、UIの一部を無効にした結果として描画すると、UIスレッドがブロックされ、進行状況ダイアログには、とにかく完了するまで進行状況が表示されません。)

後で表示するために複雑なオフスクリーンレンダリングを実行する必要がある場合は、ビューの実際のonDrawメソッドではなく、AsyncTaskまたは同様のUIスレッドから実行する必要があります。そこから完成したコールバックを取得したら、作成したばかりの事前レンダリングされた画像をすばやく描画して、進行状況ダイアログを閉じることができます。

于 2012-12-08T17:36:46.540 に答える