画布画不圆圈

时间:2016-09-29 08:13:33

标签: android canvas

在游戏的第一天,我使用画布从alpha 0到255绘制一些圆圈(就像我自己制作一个fade_in动画一样)

但是如果你看到图片(这张照片是在alpha 230中拍摄的),从alpha 0到254,这些圆圈都不平滑!(点击图片查看我的意思)

(只有当alpha变为255时,圆圈变得平滑) enter image description here 问题是什么?如何解决这个问题?

我的代码: 我有一个游戏循环,获得画布

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。 问题是因为s​​urfaceView无法为画布设置反别名(在View中你没有这个问题,我不知道为什么) 通过使用Bitmap并在其上绘制并最终通过画布绘制位图,解决了问题(而不是直接在画布上绘图)

2 个答案:

答案 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);
}

enter image description here

答案 1 :(得分:2)

你可以通过

来解决这个问题
paint.setFlags(Paint.ANTI_ALIAS_FLAG);

paint.setAntiAlias(true);