-1

情况:我在 Android 游戏上有一个画布,我有一些对象(我会尽可能简单):(所有对象和对象World都存储在哪里) ,. 我可以在画布上绘制所有这些对象。LaserBlockBlock and Laser

我想将它们“隐藏”在黑色“背景”后面,然后绘制一个模糊的“透明”圆圈,因此所有对象都隐藏在黑色背景后面,除了圆圈中的对象。

我已经考虑过了,但我想不出一种方法来做到这一点。

图片:

这是我的实际情况:

实际的

这是预期的: 预期的

4

3 回答 3

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.

我不完全确定您要问什么,因此您可能需要根据需要进行修改。

于 2013-10-26T21:10:12.963 回答
1

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

for (int i = 0 ; i < 1000*800; i++)
于 2013-10-29T15:40:52.647 回答
0

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

于 2013-10-26T21:23:06.077 回答