0

我正在将位图(球)绘制到 SurfaceView 画布上,然后在我绘制新位图(发光)以使其出现在球位图的顶部之后,我正在上下调整发光位图 alpha 以对其进行动画处理作为光泽/发光。但是闪耀位图在绘制时似乎有一些奇怪的像素错误,而且我给它的 alpha 越多,它就越糟糕。

看看这里的结果:在此处输入图像描述那些蓝色/红色像素不存在于我使用的 png 中。

这是我对球对象的初始化:

sparklePaint = new Paint();
sparklePaint.setAlpha(0);

然后是我对球对象的动画方法:

public void doAnimate() {
    if (sparkleAnimating) {
        if (sparklePaint.getAlpha() == 255) {
            sparkleOpcatyUp = false;
        }
        if (sparkleOpcatyUp) {
            int opacity = sparklePaint.getAlpha() + sparkleOpacityStep;
            if (opacity > 255) {
                opacity = 255;
            }
            sparklePaint.setAlpha(opacity);
        } else {
            int opacity = sparklePaint.getAlpha() - sparkleOpacityStep;
            if (opacity < 0) {
                opacity = 0;
            }
            sparklePaint.setAlpha(opacity);
            if (opacity == 0) {
                sparkleOpcatyUp = true;
                sparkleAnimating = false;
            }
        }
    } else {
        sparkleAnimTick++;
        if (sparkleAnimTick == sparkleAnimDelay) {
            sparkleAnimTick = 0;
            sparkleAnimating = true;
        }
    }
}

在我的绘制循环中:

for (Ball ball : balls) {
    if (ball != null && ball.getBitmap() != null) {
        int[] pos = ball.getPos();
        canvas.drawBitmap(ball.getBitmap(), pos[0], pos[1], null);

        pos = ball.getSparklePos();
        canvas.drawBitmap(ball.getSparkle(), pos[0], pos[1], ball.getSparklePaint());
        ball.doAnimate();
    }
}

关于这里出了什么问题的任何想法?这不是在另一个位图上绘制位图的方法吗?我需要设置一些混合模式吗?

该问题存在于模拟器和设备上。


谢谢索伦_

4

2 回答 2

0

尝试在油漆上使用 Paint.setDither() 和 Paint.setAntiAlias() 来绘制球和发光。

祝你好运!

于 2012-11-12T16:03:00.983 回答
0

我在画布上发现了一些奇怪的像素错误。例如,如果您画一条线,然后以不同的颜色在其上绘制,则某些像素不是应有的像素。

例如,这段代码绘制了一个矩形,然后在它上面绘制了白色,这应该会擦除它,但它并没有完全擦除!

<canvas id="myCanvas" width="600" height="600"></canvas>
<script>

var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');

 ctx.lineWidth=1;     
 ctx.strokeStyle="black"; 
 ctx.beginPath();   
 ctx.strokeRect( 100, 50, 400, 300 );
 ctx.stroke();

 alert("Redraw in white");

 ctx.strokeStyle="white"; // clear previous line   
 ctx.beginPath();   
 ctx.strokeRect( 100, 50, 400, 300 );
 ctx.stroke();

</script>
于 2013-11-06T10:39:41.187 回答