0

パノラマビューアを実装しています。私は ImageView でそれを行い、AsyncTask でマトリックスを使用して画像を移動しました (fotoこれは ImageView でmあり、マトリックスです)。

    protected void onProgressUpdate(Integer... values) {
        if (values[0] == 0) {
            m.setScale(scale, scale);
            m.postTranslate(values[1], 0);
            foto.setImageMatrix(m);
        }
    }

動きが非常にスムーズではないことを除けば、かなりうまく機能します(スムーズ=一定の速度、特に「ジャンプ」も「停止」もありません)。

解決策を探して、Canvas に関するドキュメントを読みました。

オプション "b" の Canvas への描画は、アプリケーションが定期的に再描画する必要がある場合に適しています。ビデオ ゲームなどのアプリケーションは、単独で Canvas に描画する必要があります。

これはまさに私が必要としているもののようです!! だから私は次のことをしました:

最初にscaleBitmap、ウィンドウの高さに合わせてスケーリングされた 、および画面サイズのビットマップ を作成しました (これは、再スケーリングを避けるためです) fitBitmap。次に、同じ画面サイズの四角形を 2 つ作成しdestRectますsrcRect。現在、新しいonProgressUpdate()AsyncTask メソッドは次のとおりです。

    protected void onProgressUpdate(Integer... values) {
        if (values[0] == 0) {
            srcRect.offset(-1, 0);
            canvas.drawBitmap(scaledBitmap, srcRect, destRect, null);
            foto.setImageBitmap(fitBitmap);
        }
    }

そして、これも機能します。しかし、それは以前よりもはるかに遅いです!! それだけでなく、速度を非常に低く設定しない限り、多くのフレームが「ジャンプ」します。最悪!しかし、ドキュメントによると、Canvas はアニメーションを高速化するのに適しています。だから私はひどく間違ったことをしています。

どちらが私の間違いなのか、またはこれをより適切に実装する方法を教えてください。

ありがとう!!

編集

(私が理解したこと)@aragaerの提案に基づいて、運がなければ次のことを試しました(まだ遅くてびくびくしています):

    @Override
    protected void onProgressUpdate(Integer... values) {
        if (values[0] == 0) {
            m.setScale(scale, scale);
            m.postTranslate(values[1], 0);
            canvas.drawBitmap(myBitmap, m, null);
            canvas.drawBitmap(fitBitmap, 0, 0, null);
            foto.invalidate();
        }
    }

メソッドの最後の2行のいずれか/両方をコメント/コメント解除しようとしましたが、うまくいきませんでした。最後がなければ何も起こりません。

4

1 に答える 1

0

2 番目のケースでは、ビュー全体が無効になります。それが理由です。

まったく使用しないでくださいsetImageView-ビットマップを直接オーバーライドonDrawして描画します。これはより速くなります。

正しい方法は次のようになります。

  • 使用するビューと同じサイズの独自のビットマップを作成します。
  • キャンバスを作成し、そのビットマップに描画するように設定します。
  • 何かを描く必要があるときは、そのキャンバスに何かを描きます。正確に変更された長方形を知っていると、ビューの正確な長方形を無効にします。onDraw提供されたキャンバスにキャッシュ ビットマップを描画している場所で呼び出されます。

ユーザーが表面上で指を動かすと線を描くウィジェットへのリンクは次のとおりです: link。2 つのビットマップを使用しているため、少し複雑です。1 つは内部表現用で、もう 1 つはユーザーに表示するものです。cacheそれを無視して、ビットマップの使い方を見てください。

于 2013-01-05T22:53:42.267 に答える