1

この質問は以前に何度か回答されていることは知っていますが、この初心者はうまくいく回答を見つけることができませんでした.

TouchImageView(ImageViewを拡張)を使ってパノラマビューアを実装してみました。最初に TranslateAnimation を試してみましたが、失敗しました (私の質問には回答がなかったので、これは TouchImageView では不可能だと思います)。

次に、ImageView.matrix を使用して、少し移動して、一時停止し、少し移動して、一時停止するという難しい方法を試しました...まあ、少なくともそれが私の考えでした。

問題は、何も表示されていない 4 ~ 5 秒後にパノラマが最終的な位置にしか表示されないことです。私も 2 つ入れImageView.invalidate();ましたが、成功しませんでした。Threads と AsyncTasks を使用してみましたが成功しませんでした (これらの問題は、メイン UI を更新する必要があることです。そうしないと、例外が発生します。しかし、AsyncTask を使用して UI スレッドを更新するのは間違っているようです)。そうですね、思いつく限りのことは試しました。

とにかく、以下は私の簡単なコードです (AsyncTask を試しますが、内部で行うことはすべて行います)。守られていないメソッドを観察してfoto.invalidate();くださいonPreExecute(なぜ?)。他に何を試したかを確認するためにコメントされた行がいくつかあります。

私の簡単なコード、foto(Touch)ImageView はどこにありますか:

class animatepanorama extends AsyncTask<Void, Void, Void> {
    float scale = foto.cropScale * foto.baseScale;
    Matrix m = foto.matrix;
    protected void onPreExecute(Void arg0) {
        m.setScale(scale, scale);
        foto.Scale = foto.cropScale;
        foto.setImageMatrix(m);
        foto.invalidate();
    }
    @Override
    protected Void doInBackground(Void... arg0) {
        // new Thread(new Runnable() { public void run() {
        //synchronized(foto) {
        runOnUiThread(new Runnable() {
            public void run() {
                for (int i = 0; i < 100; i++) {

                    try {
                        Thread.sleep(25);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    m.setScale(scale, scale);
                    m.postTranslate(-i * scale * 8, 0);
                    foto.setImageMatrix(m);
                    foto.invalidate();
                }
            }
        });
        //}
        // }}).start();
        return null;
    }
    protected void onPostExecute(Void arg0) {
        foto.invalidate();
    }
}

ありがとう!!

4

1 に答える 1

1

UIスレッドのdoinbackgroundから実行する代わりに、publishProgressとonProgressUpdateを使用してみてください。問題は、doinbackgroundがuithreadで実行されず、「バックグラウンドで」実行されるため、すべてのUI更新について、これをonprogressupdateに渡す必要があることです。

非同期を次のように変更します。

class animatepanorama extends AsyncTask<Void, Integer, Void> {

次に、Integerパラメーターを使用してonProgressUpdateを呼び出すことができます。

 for (int i = 0; i < 100; i++) {

        try {
            Thread.sleep(25);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        publishProgress(0);

    }

そしてこれをオーバーライドします:

@Override
protected void onProgressUpdate(Integer... values) {
    if (values[0] == 0) {
        m.setScale(scale, scale);
        m.postTranslate(-i * scale * 8, 0);
        foto.setImageMatrix(m);
        foto.invalidate();
    }
}
于 2012-12-21T00:46:15.943 に答える