Android Sombra paralela a la vista


He hecho una extensa búsqueda de ejemplos de código sobre esto, pero no puedo encontrar nada.

En particular, estoy buscando agregar una sombra a un elemento de diseño png que estoy usando en una ImageView. Este elemento de diseño png es un recto redondeado con esquinas transparentes.

¿Puede alguien proporcionar un ejemplo de código de cómo agregar una sombra paralela decente a una vista, ya sea en código o XML?

Author: coneybeare, 2010-08-25

5 answers

Podría usar una combinación de Mapa de bits.extractAlpha y un filtro Blurmask 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 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 pon shadowImage en tu ImageView. Si esta imagen nunca cambia, pero se muestra mucho, puede crearla y almacenarla en caché en onCreate para evitar la imagen costosa procesamiento.

Incluso si eso no funciona como está, debería ser suficiente para que vayas en la dirección correcta.

 31
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 14:29:36

Para sombra paralela use el código siguiente

<?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>

Use el elemento de diseño anterior 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"/>
 26
Author: om252345,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-10 19:10:02

Esto me ayudó a que la sombra funcionara, 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;
}
 9
Author: PeterE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-06 06:18:41

Para API 21(5.0)+ añada android:elevation="4dp" o android:translationZ="4dp" para ver la descripción. Documentación

Atributo de Elevación

 4
Author: Artyom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-01 01:09:22

Siempre use sombra transparente de tal manera 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"/>
 1
Author: Pradeep Kumar Kushwaha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-14 07:52:10