【发布时间】:2014-07-22 22:35:01
【问题描述】:
我有一个SurfaceView,我正在使用基本的Thread 和Canvas 设置运行动画。当我试图通过简单地将Paint 上的 alpha 从 0x22 (34) 降低到 0x00 (0) 来执行 fade 动画时,我注意到了一件奇怪的事情。动画运行时,矩形似乎没有平滑淡出;相反,它似乎跳过 alpha 级别。我知道这与我的帧速率没有任何关系,因为我以 60 FPS 的速度运行它。考虑到这与我的实现方式有关,我让画布画出一条白色矩形,alpha 值递减。这就是我得到的......
使用以下代码绘制图像:
private void onDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
Paint w = new Paint();
w.setColor(Color.WHITE);
Paint r = new Paint();
r.setColor(Color.RED);
r.setStrokeWidth(1.0f);
for(int i = 0x22; i >= 0; i--) {
w.setAlpha(i);
int y = (0x22 - i) * 50;
canvas.drawRect(0, y, 100, y + 50, w);
canvas.drawLine(100, y, 110, y, r);
}
}
可能很难看到,但看起来 alpha 以块为单位减小并且不平滑。您可以看出红线划定了一个新的矩形,但 alpha 似乎没有适当降低。我怀疑这就是即使我以 60 FPS 运行时 alpha 动画看起来也不流畅的原因。有没有人经历过这种情况和/或知道如何在SurfaceView 上使用Canvas 获得平滑的alpha 动画?
【问题讨论】:
-
您使用的是预乘 alpha 颜色吗?
-
抱歉,每乘 alpha 颜色是什么意思?我在
Canvas上绘制的所有内容都显示为上面的代码 sn-p。 -
SurfaceView 的默认像素格式是 RGB 565。你打电话给
mSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT)了吗? -
哇...做到了!非常感谢!您应该将此作为答案发布,我绝对会接受!
-
完成。 FWIW,预乘的 alpha 问题与实际颜色值有关——RGBA {128,128,128,128} 在一种配置中是全白的,透明度为 50%,在另一种配置中是 50% 的灰色和 50% 的透明度。所以我的第一个想法是颜色值不正确,但是当我重新阅读您的问题时,我意识到这可能是颜色深度问题。
标签: android animation android-canvas surfaceview alpha