パノラマビューアを実装しています。私は 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行のいずれか/両方をコメント/コメント解除しようとしましたが、うまくいきませんでした。最後がなければ何も起こりません。