情况:我在Android游戏上有画布,我有一些对象(我会尽量保持简单):World
(存放所有Laser
}和Block
个对象),Block and Laser
。我可以在画布中绘制所有这些对象。
我想将它们“隐藏”在黑色“背景”后面,然后绘制一个模糊的“透明”圆圈,这样所有物体都隐藏在黑色背景后面,除了那些使圆圈晃动的物体。
我已经考虑过了,但是我想不出这样做的方法。
图片:
这是我的实际情况:
这是预期的:
答案 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)
您可以创建一个带有透明孔的黑色矩形图像。该孔将是您可以看到的圆,并且图像将呈现在您想要可见的位置上。然后,您可以在图像周围绘制四个黑色矩形以覆盖屏幕的其余部分。