在圆圈后面绘制物体,除了“背景”背后的物体

时间:2013-10-26 19:57:33

标签: java android android-canvas draw

情况:我在Android游戏上有画布,我有一些对象(我会尽量保持简单):World(存放所有Laser }和Block个对象),Block and Laser。我可以在画布中绘制所有这些对象。

我想将它们“隐藏”在黑色“背景”后面,然后绘制一个模糊的“透明”圆圈,这样所有物体都隐藏在黑色背景后面,除了那些使圆圈晃动的物体。

我已经考虑过了,但是我想不出这样做的方法。

图片:

这是我的实际情况:

Actual

这是预期的: Expected

3 个答案:

答案 0 :(得分:2)

做这样的事情:

    public void drawBitmapsInCanvas(Canvas c){
        c.drawBitmap(block, new Rect(/*coordinates here*/), new Rect(/*More coordinates*/),null);
        c.drawBitmap(block2, new Rect(/*coordinates here*/), new Rect(/*More coordinates*/),null);
        c.drawBitmap(laser, new Rect(/*coordinates here*/), new Rect(/*More coordinates*/),null);
        c.drawColor(Color.BLACK);//this hides everything under your black background.
        c.drawBitmap(circle, new Rect(/*coordinates here*/), new Rect(/*More coordinates*/),null);
    }

如果你想要透明度:

    Paint paint =new Paint();
    paint.setARGB(120,0,0,0); //for the "120" parameter, 0 is completely transparent, 255 is completely opaque.
    paint.setAntiAlias(true);
    c.drawBitmap(bmp,Rect r,Rect rr, paint);

或者如果你试图改变单个像素的不透明度,这个方法有点复杂(我没有测试过代码,但你得到了它的要点):

public static final Bitmap getNewBitmap(Bitmap bmp, int circleCenterX,
int circleCenterY,int circleRadius){
    //CIRCLE COORDINATES ARE THE DISTANCE IN RESPECT OF (0,0) of the bitmap
    //, not (0,0) of the canvas itself. The circleRadius is the circle's radius.
    Bitmap temp=bmp.copy(Bitmap.Config.ARGB_8888, true);
    int[]pixels = new int[temp.getWidth()*temp.getHeight()];
    temp.getPixels(pixels,0 ,temp.getWidth(),0,0,temp.getWidth(), temp.getHeight());
    int counter=0;
    for(int i=0;i<pixels.length;i++){
        int alpha=Color.alpha(pixels[i]);
        if(alpha!=0&&!((Math.pow(counter/temp.getWidth()-circleCenterY,2.0)+
        Math.pow(counter%temp.getWidth()-circleCenterX,2.0))<Math.pow(circleRadius,2.0))){
        //if the pixel itself is not completely transparent and the pixel is NOT within range of the circle,
        //set the Alpha value of the pixel to 0.
            pixels[i]=Color.argb(0,Color.red(pixels[i]),Color.green(pixels[i]),Color.blue(pixels[i]));
        }
        counter++;
    }
    temp.setPixels(pixels,0, temp.getWidth(),0,0,temp.getWidth(),temp.getHeight());
    return temp;
}

然后绘制temp.

我不完全确定你要问的是什么,所以你可能需要根据需要进行修改。

答案 1 :(得分:1)

如果您尝试qwertyuiop5040的第二个答案,当您尝试将其应用于大图像时,您将获得低性能。假设一张1000 * 800像素的图像。然后你会有一个循环:

for (int i = 0 ; i < 1000*800; i++)

答案 2 :(得分:0)

您可以创建一个带有透明孔的黑色矩形图像。该孔将是您可以看到的圆,并且图像将呈现在您想要可见的位置上。然后,您可以在图像周围绘制四个黑色矩形以覆盖屏幕的其余部分。