我实施了一个自定义View
,它通过动画的ScaleAnimation/TranslateAnimation
应用自定义getTransformation()
。即应用程序放大到更大位图的某个点(位图比屏幕大)。在更高分辨率的设备(例如三星Galaxy S3,即x-hdpi)上,缩放(实际缩放+平移)过程闪烁并且强烈地断断续续。 (更确切地说,图像闪烁的许多部分,其他部分都可以。例如图像闪烁中包含的文本字幕。)其他设备上也有一些闪烁,例如Desire HD。 (请注意,自定义视图是必需的,因为稍后,我也会在其上应用其他自定义动画,但现在这无关紧要。)
当动画开始时,位图缩小(即从“距离”可见)。动画会同时放大和翻译。
我认为位图可能太大(实际上它不小),但我尝试了一切没有运气:我把正确的版本放到hdpi,xhpdi等等,我也尝试使用较小尺寸的位图,我尝试通过下采样decodeResource()
,但没有任何帮助。
实际上,自定义View
包含一个名为MyBackgroundDrawable
的自定义drawable。 MyBackgroundDrawable
类处理动画并绘制变换后的位图。
这是自定义onDraw()
的{{1}}代码:
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);
的{{1}}方法(即我的自定义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