情况:我在 Android 游戏上有一个画布,我有一些对象(我会尽可能简单):(所有对象和对象World
都存储在哪里) ,. 我可以在画布上绘制所有这些对象。Laser
Block
Block and Laser
我想将它们“隐藏”在黑色“背景”后面,然后绘制一个模糊的“透明”圆圈,因此所有对象都隐藏在黑色背景后面,除了圆圈中的对象。
我已经考虑过了,但我想不出一种方法来做到这一点。
图片:
这是我的实际情况:
这是预期的:
情况:我在 Android 游戏上有一个画布,我有一些对象(我会尽可能简单):(所有对象和对象World
都存储在哪里) ,. 我可以在画布上绘制所有这些对象。Laser
Block
Block and Laser
我想将它们“隐藏”在黑色“背景”后面,然后绘制一个模糊的“透明”圆圈,因此所有对象都隐藏在黑色背景后面,除了圆圈中的对象。
我已经考虑过了,但我想不出一种方法来做到这一点。
图片:
这是我的实际情况:
这是预期的:
做这样的事情:
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.
我不完全确定您要问什么,因此您可能需要根据需要进行修改。
如果您尝试 qwertyuiop5040 的第二个答案,当您尝试将其应用于大图像时,您将获得非常低的性能。假设一个 1000*800 像素的图像。然后你会有一个循环:
for (int i = 0 ; i < 1000*800; i++)
您可以创建一个带有透明孔的黑色矩形图像。孔将是您可以看到的圆圈,并且图像将呈现在您希望可见的位置上。然后,您可以在图像周围绘制四个黑色矩形以覆盖屏幕的其余部分。