2010-08-25 23 views
30

He hecho algunas búsquedas exhaustivas de ejemplos de código pero no puedo encontrar nada.Android Drop Shadow en View

En particular, estoy buscando a añadir una sombra a un dibujable png estoy usando en un ImageView. Este png dibujable es un rect redondo con esquinas transparentes.

Puede alguien por favor proporcione un ejemplo de código de cómo agregar una sombra paralela a una vista decente, ya sea en clave o XML?

+0

puede generar fácilmente la sombra ninepatch uso de esta herramienta http://inloop.github.io/shadow4android/ – Yuraj

Respuesta

29

Puede utilizar una combinación de Bitmap.extractAlpha y BlurMaskFilter para crear manualmente una sombra paralela para cualquier imagen que necesite mostrar, pero eso solo funcionaría si su imagen solo se carga/muestra de vez en cuando, ya que la el proceso es costoso

Pseudo-código (incluso podría compilar!):

BlurMaskFilter blurFilter = new BlurMaskFilter(5, BlurMaskFilter.Blur.OUTER); 
Paint shadowPaint = new Paint(); 
shadowPaint.setMaskFilter(blurFilter); 

int[] offsetXY = new int[2]; 
Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY); 

/* Might need to convert shadowImage from 8-bit to ARGB here, can't remember. */ 

Canvas c = new Canvas(shadowImage); 
c.drawBitmap(originalBitmap, offsetXY[0], offsetXY[1], null); 

Luego puso ShadowImage en su ImageView. Si esta imagen nunca cambia pero se muestra mucho, puede crearla y almacenarla en caché en Crear para evitar el costoso procesamiento de imagen.

Incluso si eso no funciona como es, debería ser suficiente para que te va en la dirección correcta.

+3

De alguna manera ... Una vez que trabajó cambió el offsetXY [[0] y [1] en el drawBitmap para que sea negativo de los valores alineados correctamente. Sin embargo, el mapa de bits original está dibujando como una imagen negra sólida. http://cl.ly/77e6b7839c1ffc94c1e0 ¿Cómo solucionarlo? – coneybeare

+0

No estoy seguro sin ver el código. Intente verificar los bitdepths de los mapas de bits de origen y de destino. El problema podría ser que está dibujando una imagen de 32 bits (el original) en una imagen de 8 bits (la imagen de sombra extraída). Si ese es el caso, haga algo como Bitmap shadowImage32 = shadowImage.copy (ARGB_8888, true) arriba donde tengo el comentario de conversión, y dibuje sobre ese chico en lugar de la sombra de 8 bits. – Josh

+0

Hola @Josh Estoy usando tu código. Está funcionando, pero ¿cómo podemos cambiar el color de sombra? –

25

Para gota uso debajo de la sombra de código

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <gradient 
    android:startColor="#ffffff" 
    android:centerColor="#d3d7cf" 
    android:endColor="#2e3436" 
    android:angle="90" /> 
</shape> 

uso anterior estirable para un fondo de una vista

<View 
    android:id="@+id/divider" 
    android:background="@drawable/black_white_gradient" 
    android:layout_width="match_parent" 
    android:layout_height="10sp" 
    android:layout_below="@+id/buildingsList"/> 
+8

Esto no se explica tan bien como podría ser, pero no es un enfoque completamente malo. El punto clave es que la vista con el degradado como fondo es una vista separada que debe colocarse inmediatamente debajo de la vista en la que desea que aparezca la sombra. Esto funciona mejor cuando la vista que se va a sombrear ocupa todo el ancho de la pantalla; de lo contrario, las esquinas se verán mal. –

+0

Este es un enfoque para situaciones declarativas, pero en mi caso creo un número dinámico de botones en el código dependiendo de la lectura de datos, por lo que no es de mucha utilidad para mi caso. – jrichview

8

Esto me ayudó a conseguir la sombra de trabajo así que quería compartir el código de trabajo:

private Bitmap createShadowBitmap(Bitmap originalBitmap) { 
    BlurMaskFilter blurFilter = new BlurMaskFilter(5, BlurMaskFilter.Blur.OUTER); 
    Paint shadowPaint = new Paint(); 
    shadowPaint.setMaskFilter(blurFilter); 

    int[] offsetXY = new int[2]; 
    Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY); 

    /* Need to convert shadowImage from 8-bit to ARGB here. */ 
    Bitmap shadowImage32 = shadowImage.copy(Bitmap.Config.ARGB_8888, true); 
    Canvas c = new Canvas(shadowImage32); 
    c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null); 

    return shadowImage32; 
} 
3

Para API 21 (5,0) + añadir android:elevation="4dp" o android:translationZ="4dp" para ver la descripción. Documentation

Elevation Attribute

1

Utilice siempre la sombra transparente tal que puedan pegarse a cualquier color.

shadow.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <gradient 
    android:startColor="#002e3436" 
    android:endColor="#992e3436" 
    android:angle="90" /> 
</shape> 

y en vista

<View 
    android:id="@+id/divider" 
    android:background="@drawable/shadow" 
    android:layout_width="match_parent" 
    android:layout_height="5dp"/>