0

SurfaceView キャンバスにビットマップ (ボール) を描画し、新しいビットマップ (シャイン) を描画してボール ビットマップの上に表示させた直後に、シャイン ビットマップ アルファを上下に調整してアニメートします。輝き/輝きとして。しかし、シャイン ビットマップは、描画時に奇妙なピクセル エラーが発生するようで、アルファを多く与えるほど悪化します。

ここで結果を見てください:ここに画像の説明を入力これらの青/赤のピクセルは、私が使用する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 に答える