在游戏的第一天,我使用画布从alpha 0到255绘制一些圆圈(就像我自己制作一个fade_in动画一样)
但是如果你看到图片(这张照片是在alpha 230中拍摄的),从alpha 0到254,这些圆圈都不平滑!(点击图片查看我的意思)
(只有当alpha变为255时,圆圈变得平滑) 问题是什么?如何解决这个问题?
我的代码: 我有一个游戏循环,获得画布
paintAlpha = 0;
paint = new Paint();
paint.setAntiAlias(true);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setAlpha(paintAlpha);
paint.setColor(Color.parseColor(color));
然后在我看来,起初我设置了:
if(paintAlpha < 255) {
paintAlpha+=1;
paint.setAlpha(paintAlpha);
}
canvas.drawCircle(cx, cy, currentRadius, paint);
然后在每个循环(每个滴答)中我这样做:
{{1}}
解决方案: 感谢@nitesh。 问题是因为surfaceView无法为画布设置反别名(在View中你没有这个问题,我不知道为什么) 通过使用Bitmap并在其上绘制并最终通过画布绘制位图,解决了问题(而不是直接在画布上绘图)
答案 0 :(得分:9)
将以下属性设置为绘制对象
paint.setAntiAlias(true);
为了更好地理解和其他方法,请参阅此链接 https://medium.com/@ali.muzaffar/android-why-your-canvas-shapes-arent-smooth-aa2a3f450eb5#.p9iktozdi
来自文章
如果出现以下情况,请先绘制位图:
- 你需要保留图像
- 你需要绘制透明像素
- 您的形状不会经常变化和/或需要耗时的操作
使用消除锯齿绘制平滑边缘
如果可能,请避免在位图上重绘,否则在重绘之前清除位图。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(200,
200,
Bitmap.Config.ARGB_8888);
bitmapCanvas = new Canvas(bitmap);
}
bitmapCanvas.drawColor(
Color.TRANSPARENT,
PorterDuff.Mode.CLEAR); //this line moved outside if
drawOnCanvas(bitmapCanvas);
canvas.drawBitmap(bitmap, mLeftX, mTopY, p);
}
protected void drawOnCanvas(Canvas canvas) {
canvas.drawCircle(mLeftX + 100, mTopY + 100, 100, p);
}
答案 1 :(得分:2)
你可以通过
来解决这个问题paint.setFlags(Paint.ANTI_ALIAS_FLAG);
或
paint.setAntiAlias(true);