2010-11-11 26 views
9

¿Hay alguna manera de dibujar una máscara de degradado circular en un mapa de bits en Android? Tratando de producir algo similar a una ventana nublada. Haga clic en la ventana y aparecerá un círculo transparente que revela qué hay detrás de la ventana. Preferiblemente usando un gradiente para que el centro del círculo sea completamente transparente y cuanto más alejado del centro, menos transparente. es posible?Android Circular Gradient Alpha Mask

Soy nuevo en Android por lo que cualquier muestra de código sería apreciada.

Gracias.

Respuesta

19
private void drawFoggyWindowWithTransparentCircle(Canvas canvas, 
     float circleX, float circleY, float radius) { 

    // Get the "foggy window" bitmap 
    BitmapDrawable foggyWindow = 
     (BitmapDrawable) getResources().getDrawable(R.drawable.foggy_window); 
    Bitmap foggyWindowBmp = foggyWindow.getBitmap(); 

    // Create a temporary bitmap 
    Bitmap tempBitmap = Bitmap.createBitmap(
      foggyWindowBmp.getWidth(), 
      foggyWindowBmp.getHeight(), 
      Bitmap.Config.ARGB_8888); 
    Canvas tempCanvas = new Canvas(tempBitmap); 

    // Copy foggyWindowBmp into tempBitmap 
    tempCanvas.drawBitmap(foggyWindowBmp, 0, 0, null); 

    // Create a radial gradient 
    RadialGradient gradient = new android.graphics.RadialGradient(
      circleX, circleY, 
      radius, 0xFF000000, 0x00000000, 
      android.graphics.Shader.TileMode.CLAMP); 

    // Draw transparent circle into tempBitmap 
    Paint p = new Paint(); 
    p.setShader(gradient); 
    p.setColor(0xFF000000); 
    p.setXfermode(new PorterDuffXfermode(Mode.DST_OUT)); 
    tempCanvas.drawCircle(circleX, circleY, radius, p); 

    // Draw tempBitmap onto the screen (over what's already there) 
    canvas.drawBitmap(tempBitmap, 0, 0, null); 
} 
+1

¡Gracias! ¡Muy útil! –

+0

Gracias por esta respuesta, me ayudó mucho. –