在自定义视图上闪烁TranslateAnimation / ScaleAnimation

时间:2012-08-02 22:50:04

标签: android android-animation android-view flicker

我实施了一个自定义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

0 个答案:

没有答案