9

私は大きなサイズの画像を扱っていますが、それらを回転させようとすると(applying matrix on the bitmap)、多くの秒数が発生します。代わりに、Androidシステムギャラリーがこのタスクを非常に高速に実行できることを確認しました。どうしてそれは可能ですか?

メインスレッドにImageViewローテーション(時間はかかりません)のみを適用して、asyncTaskでローテーションを実行しようと思いましたが、asyncTaskが終了する前にアプリが強制終了されると、アプリは一貫性のない状態になります。

これは私のビットマップ回転コードであり、大きなビットマップの実行には長い時間がかかります。

Matrix mat = new Matrix();
mat.setRotate(90);
bMap = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), mat, true);
4

1 に答える 1

4

大きな画像に変更を加える場合は、その画像の低品質のビットマップコピーを作成し、それを使用して瞬間的な回転やその他の編集効果を表示します。ユーザーがモーション(または左スライダーコントロール)を停止したら、低品質のビットマップを、同じ効果が適用された元の画像に置き換えます。これにより、ユーザーエクスペリエンスが大幅に向上します。試して、私に知らせてください。

これは、元の要件からの逸脱のように聞こえるかもしれません。画像全体をリアルタイムで回転させる代わりに、長方形を描くことができます。結局、ユーザーが必要とするのは、彼の画像がどれだけ回転したかを示すことです。これはより高速になり、UIスレッドでラグなしで簡単に実行できます。

これは、キャンバスコードで最も単純な回転です。

canvas.save(); //save the position of the canvas
canvas.rotate(angle, X + (imageW / 2), Y + (imageH / 2)); //rotate the canvas
canvas.drawBitmap(imageBmp, X, Y, null); //draw the image on the rotated canvas
canvas.restore();  // restore the canvas position.
于 2012-05-19T09:41:28.760 に答える