Android 画布画不光滑的圆

Android 画布画不光滑的圆,android,canvas,Android,Canvas,在我的第一个游戏中,我用画布从alpha 0到255画了一些圆圈(就像自己在动画中做淡入淡出) 但若你们在图片中看到(这张图片是在alpha 230中拍摄的),从alpha 0到254,这些圆圈并不平滑!(点击图片了解我的意思) (只有当alpha变为255时,圆才会变得平滑) 有什么问题?我如何解决 我的代码: 我有一个游戏循环,它得到画布 canvas=gameView.getHolder().lockCanvas(); 在我看来,首先我设置: paintAlpha = 0;

在我的第一个游戏中,我用画布从alpha 0到255画了一些圆圈(就像自己在动画中做淡入淡出)

但若你们在图片中看到(这张图片是在alpha 230中拍摄的),从alpha 0到254,这些圆圈并不平滑!(点击图片了解我的意思)

(只有当alpha变为255时,圆才会变得平滑) 有什么问题?我如何解决

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

canvas=gameView.getHolder().lockCanvas();

在我看来,首先我设置:

    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);
if(paintAlpha<255){
paintAlpha+=1;
paint.setAlpha(paintAlpha);
}
画布.画圈(cx,cy,currentRadius,paint);
解决方案: 感谢@nitesh。 问题是因为surfaceView无法将反别名设置为canvas(鉴于您没有此问题,我不知道为什么)
通过使用位图并在其上绘制,最后通过画布绘制位图,解决了问题(而不是直接在画布上绘制)

您可以通过

paint.setFlags(Paint.ANTI_ALIAS_FLAG);


你可以通过

paint.setFlags(Paint.ANTI_ALIAS_FLAG);


将以下属性设置为“绘制对象”

paint.setAntiAlias(true);
为了更好地理解和其他方法,请参考此链接

来自文章

如果:
-您需要保留映像。
-您需要绘制透明像素。
-您的形状不会经常更改和/或需要耗时的操作。
使用抗锯齿绘制平滑边。
如果可能,避免在位图上重画,或者在重画之前清除位图

@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);
}

将以下属性设置为“绘制对象”

paint.setAntiAlias(true);
为了更好地理解和其他方法,请参考此链接

来自文章

如果:
-您需要保留映像。
-您需要绘制透明像素。
-您的形状不会经常更改和/或需要耗时的操作。
使用抗锯齿绘制平滑边。
如果可能,避免在位图上重画,或者在重画之前清除位图

@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);
}

我也设置了它,它没有帮助我也设置了它,它没有帮助我也设置了它,它没有帮助查看我的更新答案并遵循文章中的方法你的意思是当我想画alpha小于255的东西时,我需要先在它下面画一个位图?非常感谢你,伙计,你解决了我的问题:)问题是因为surfaceView和位图技巧。我也设置了它,它无助于查看我的更新答案并遵循文章中的方法。你的意思是,当我要绘制alpha小于255的东西时,我需要先在它下面绘制一个位图?非常感谢你,伙计,你解决了我的问题:)问题是因为surfaceView和bitmap trick.loop解决的?你是什么意思?我说这是一个游戏,我是说游戏线程循环?你是什么意思?我说这是一个游戏,我是说游戏线程循环