アニメーションのを介してカスタムView
を適用するカスタムを実装しました。つまり、アプリケーションはより大きなビットマップの特定のポイントにズームインします (ビットマップは画面よりも大きい)。高解像度のデバイス (x-hdpi である Samsung Galaxy S3 など) では、ズーム (実際には拡大縮小 + 変換) プロセスがちらつき、激しく途切れます。(より正確には、画像の多くの部分がちらつきますが、他の部分は問題ありません。たとえば、画像に含まれるテキスト キャプションがちらつきます。) Desire HD など、他のデバイスでもちらつきがあります。(後で、他のカスタム アニメーションも適用するため、カスタム ビューが必要であることに注意してください。ただし、今は関係ありません。)ScaleAnimation/TranslateAnimation
getTransformation()
アニメーションが始まると、ビットマップは縮小されます (つまり、「距離」から見えるようになります)。アニメーションはズームインと平行移動を同時に行います。
私はビットマップが大きすぎるかもしれないと思った(実際には小さくはない)が、運がなかったすべてを試した:hdpi、xhpdiなどに正しいバージョンを入れdecodeResource()
た助けた。
実際には、カスタムView
には と呼ばれるカスタム ドローアブルが含まれていますMyBackgroundDrawable
。クラスはMyBackgroundDrawable
アニメーションを処理し、変換されたビットマップを描画します。
onDraw()
これはカスタムのコードですView
:
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
mMyBackgroundDrawable.draw(canvas); // my custom Drawable
invalidate();
}
これは私がビットマップをロードする方法です:
Resources res = context.getResources();
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inScaled = false;
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.mybackground, opt);
Drawable mMyDrBackground = new BitmapDrawable(res, bmp);
そして、これは(つまり私のカスタム)のdraw()
方法です:mMyBackgroundDrawable
Drawable
@Override
public void draw(Canvas canvas) {
int sc = canvas.save();
sWorld.reset(); // this is a Matrix
if (mMyAnimation!= null) {
mMyAnimation.getTransformation(AnimationUtils.currentAnimationTimeMillis(), mTransformation);
sWorld = mTransformation.getMatrix();
}
sMatrix.reset();
sMatrix.preTranslate(sViewportX / 2, sViewportY / 2);
sMatrix.preConcat(sWorld);
sMatrix.preConcat(mPosition);
canvas.setMatrix(sMatrix);
mMyDrBackground .draw(canvas);
canvas.restoreToCount(sc);
}
実際にmMyAnimation
は、AnimationSet
であり、(ちらつきが発生している間) を再生していますTranslateAnimation+ScaleAnimation
(同時に、ズームとビットマップの特定のポイントへの移動を同時に行っているため)。
ちらつきやカクつきが発生するのはなぜですか? どうすれば解決できますか?
更新onMeasure()
:カスタムには実装しませんでしたView
。これはこのような問題を引き起こす可能性がありますか? 私のカスタム ビューは、このレイアウトに追加されます (つまり、にlayoutRoot
):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/layoutRoot" >
</RelativeLayout>