Android “elevación” no muestra una sombra

Tengo un ListView, y con cada elemento de la lista quiero que muestre una sombra debajo de él. Estoy usando la nueva característica de elevación de Android Lollipop para establecer una Z en la Vista que quiero proyectar una sombra, y ya lo estoy haciendo de manera efectiva con la Barra de Acción (técnicamente una Barra de Herramientas en Lollipop). Estoy usando la elevación de Lollipop, pero por alguna razón no muestra una sombra debajo de los elementos de la lista. Aquí se muestra cómo se configura cada elemento de la lista:

          

Sin embargo, así es como muestra el elemento de la lista, sin una sombra: enter image description here

También he intentado lo siguiente en vano:

  1. Establezca la elevación en ImageView y TextViews en lugar del diseño principal.
  2. Aplicado un fondo al ImageView.
  3. Utiliza TranslationZ en lugar de Elevation.

He estado jugando un poco con sombras en Lollipop y esto es lo que he encontrado:

  1. Parece que los límites de un ViewGroup de ViewGroup padre ViewGroup la sombra de sus hijos por alguna razón; y
  2. las sombras establecidas con android:elevation están cortadas por los límites de la vista, no los límites extendidos a través del margen;
  3. La forma correcta de obtener una vista secundaria para mostrar sombra es establecer el relleno en el elemento primario y establecer android:clipToPadding="false" en ese elemento primario.

Aquí está mi sugerencia para usted según lo que sé:

  1. Establezca su RelativeLayout nivel superior para que tenga relleno igual a los márgenes que ha establecido en el diseño relativo que desea mostrar sombra;
  2. set android:clipToPadding="false" en el mismo RelativeLayout ;
  3. Elimine el margen de RelativeLayout que también tiene un conjunto de elevación;
  4. [EDIT] también puede necesitar establecer un color de fondo no transparente en el diseño secundario que necesita elevación.

Al final del día, su diseño relativo de nivel superior debería verse así:

  

El diseño relativo interior debe verse así:

  

Si tiene una vista sin fondo, esta línea lo ayudará

 android:outlineProvider="bounds" 

Por defecto, shadow está determinado por el fondo de la vista, por lo que si no hay fondo, tampoco habrá sombra.

Aparentemente, no puedes simplemente establecer una elevación en una Vista y hacer que aparezca. También necesita especificar un fondo.

Las siguientes líneas agregadas a mi LinearLayout finalmente mostraron una sombra:

 android:background="@android:color/white" android:elevation="10dp" 

otra cosa que debes tener en cuenta, las sombras no se mostrarán si tienes esta línea en el manifiesto:

android: hardwareAccelerated = “falso”

Intenté todas las sugerencias, pero solo funcionó cuando quité la línea, la razón por la que tenía la línea era porque mi aplicación funciona con varias imágenes de mapas de bits y hacían que la aplicación fallara.

Si agrega elevación a un elemento de botón, debe agregar la siguiente línea:

 android:stateListAnimator="@null" 

Ver Android 5.0 android: elevation funciona para ver, pero no Button?

Uf, solo pasé una hora tratando de resolver esto. En mi caso, tenía un conjunto de antecedentes, sin embargo, estaba configurado en un color. Esto no es suficiente, debe tener el fondo de la vista configurado como dibujable.

por ejemplo, esto no tendrá una sombra:

  

pero esto será

  

EDITAR: también descubrieron que si utiliza un selector como fondo, si no tiene el conjunto de esquinas, entonces la sombra no aparecerá en la ventana de vista previa, pero aparecerá en el dispositivo

por ejemplo, esto no tiene una sombra en la vista previa:

         

pero esto hace:

          

Agregar color de fondo me ayudó.

  

Si desea tener fondo transparente y android:outlineProvider="bounds" no funciona para usted, puede crear ViewOutlineProvider personalizado:

 class TransparentOutlineProvider extends ViewOutlineProvider { @Override public void getOutline(View view, Outline outline) { ViewOutlineProvider.BACKGROUND.getOutline(view, outline); Drawable background = view.getBackground(); float outlineAlpha = background == null ? 0f : background.getAlpha()/255f; outline.setAlpha(outlineAlpha); } } 

Y configure este proveedor para su vista transparente:

 transparentView.setOutlineProvider(new TransparentOutlineProvider()); 

Fuentes: https://code.google.com/p/android/issues/detail?id=78248#c13

[EDITAR] La documentación de Drawable.getAlpha () dice que es específica de cómo el Drawable amenaza al alfa. Es posible que siempre devuelva 255. En este caso, puede proporcionar el alfa manualmente:

 class TransparentOutlineProvider extends ViewOutlineProvider { private float mAlpha; public TransparentOutlineProvider(float alpha) { mAlpha = alpha; } @Override public void getOutline(View view, Outline outline) { ViewOutlineProvider.BACKGROUND.getOutline(view, outline); outline.setAlpha(mAlpha); } } 

Si su fondo de vista es un StateListDrawable con el color predeterminado # DDFF0000 que está con alpha DDx0 / FFx0 == 0.86

 transparentView.setOutlineProvider(new TransparentOutlineProvider(0.86f)); 

Si tiene una vista sin fondo, esta línea lo ayudará

 android:outlineProvider="bounds" 

Si tiene una vista con fondo, esta línea lo ayudará

 android:outlineProvider="paddedBounds" 

a veces, como background = “@ color / *” o background = “# ff33 ” no funciona, reemplazo background_color con dibujable, luego funciona

dar un poco de color de fondo para el diseño trabajado para mí como:

  android:background="@color/catskill_white" android:layout_height="?attr/actionBarSize" android:elevation="@dimen/dimen_5dp" 

Agregando a la respuesta aceptada, hay una razón más debido a que la elevación puede no funcionar como se esperaba.

Si la función de filtro Bluelight en el teléfono está encendida

Estaba enfrentando este problema cuando la elevación parecía completamente distorsionada e insoportable en mi dispositivo. Pero la elevación estuvo bien en la vista previa. Apagar el filtro Bluelight en el teléfono resolvió el problema.

Entonces, incluso después de configurar

 android:outlineProvider="bounds" 

La elevación no funciona correctamente, entonces puede tratar de jugar con la configuración de color del teléfono.

Creo que su problema se debe al hecho de que ha aplicado el elemento de elevación a un diseño relativo que llena su elemento primario. Su elemento primario recorta todas las vistas secundarias dentro de su propio canvas de dibujo (y es la vista que maneja la sombra del elemento secundario). Puede solucionar esto aplicando una propiedad de elevación al RelativeLayout superior en su vista xml (la etiqueta raíz).

En mi caso, las fonts eran el problema.

1) Sin fontFamily necesitaba establecer android:background a algún valor.

  

2) con fontFamily tuve que agregar la android:outlineProvider="bounds" :

  

Tuve un poco de suerte al configurar clipChildren="false" en el diseño principal.