Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android "elevación" que no muestra una sombra

Tengo un ListView, y con cada elemento de lista quiero mostrar una sombra debajo de él. Estoy usando la nueva función de elevación de Android Lollipop para establecer una Z en la Vista que quiero echar una sombra, y ya estoy haciendo esto de manera efectiva con la ActionBar (técnicamente una barra de herramientas en Lollipop). Estoy usando la elevación de Lollipop, pero por alguna razón no está mostrando una sombra bajo los elementos de la lista. A continuación, se muestra cómo se configura el diseño de cada elemento de la lista:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" style="@style/block" android:gravity="center" android:layout_gravity="center" android:background="@color/lightgray" > <RelativeLayout android:layout_width="300dp" android:layout_height="300dp" android:layout_marginLeft="40dp" android:layout_marginRight="40dp" android:layout_marginTop="20dp" android:layout_marginBottom="20dp" android:elevation="30dp" > <ImageView android:id="@+id/documentImageView" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" /> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/alphared" android:layout_alignParentBottom="true" > <appuccino.simplyscan.Extra.CustomTextView android:id="@+id/documentName" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/white" app:typeface="light" android:paddingLeft="16dp" android:paddingTop="8dp" android:paddingBottom="4dp" android:singleLine="true" android:text="New Document" android:textSize="27sp"/> <appuccino.simplyscan.Extra.CustomTextView android:id="@+id/documentPageCount" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/white" app:typeface="italic" android:paddingLeft="16dp" android:layout_marginBottom="16dp" android:text="1 page" android:textSize="20sp"/> </LinearLayout> </RelativeLayout> </RelativeLayout> 

Sin embargo, aquí es cómo muestra el elemento de la lista, sin una sombra: Introduzca aquí la descripción de la imagen

También he intentado lo siguiente sin éxito:

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

  • Android Drop Shadow en la vista
  • Cómo crear sombra de botón en el estilo de diseño de material android
  • ¿Cómo puedo sombrear el PackageManager con Robolectric
  • Cambio de Android Color de sombra de elevación de material
  • Cómo aplicar sombra a ImageView?
  • Robolectric sombra no funciona
  • Cómo configurar la sombra de una vista en Android?
  • Cómo proporcionar la sombra al botón
  • 11 Solutions collect form web for “Android "elevación" que no muestra una sombra”

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

    1. Parece que los límites de un padre ViewGroup la sombra de sus hijos por alguna razón; y
    2. Sombras establecidas con android:elevation son corte 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 de niño para mostrar sombra es establecer el relleno en el padre y establecer android:clipToPadding="false" en ese padre.

    Aquí está mi sugerencia a usted basado en lo que sé:

    1. Establezca su RelativeLayout nivel superior para que el relleno sea igual a los márgenes que haya establecido en el diseño relativo que desea mostrar sombra;
    2. Set android:clipToPadding="false" en el mismo RelativeLayout ;
    3. Quitar el margen de la RelativeLayout que también tiene conjunto de elevación;
    4. [EDITAR] también puede ser necesario 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 tener este aspecto:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" style="@style/block" android:gravity="center" android:layout_gravity="center" android:background="@color/lightgray" android:paddingLeft="40dp" android:paddingRight="40dp" android:paddingTop="20dp" android:paddingBottom="20dp" android:clipToPadding="false" > 

    El diseño interior relativo debe tener este aspecto:

     <RelativeLayout android:layout_width="300dp" android:layout_height="300dp" android:background="[some non-transparent color]" android:elevation="30dp" > 

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

     android:outlineProvider="bounds" 

    Por defecto la sombra se determina por el fondo de la vista, así que si no hay fondo, tampoco habrá sombra.

    Al parecer, no se puede establecer una elevación en una vista y hacer que aparezca. También es necesario especificar un fondo.

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

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

    Una otra cosa que usted debe ser consciente de, las sombras no se mostrarán si usted tiene esta línea en el manifiesto:

    Android: hardwareAccelerated = "false"

    He intentado todas las cosas sugeridas, pero sólo funcionó para mí cuando eliminé la línea, la razón por la que tenía la línea era porque mi aplicación funciona con un número de imágenes de mapa de bits y que estaban causando la caída de la aplicación.

    Ugh, sólo pasé una hora tratando de entender esto. En mi caso tuve un set de fondo, sin embargo, se estableció en un color. Esto no es suficiente, necesita tener el fondo de la vista establecida en un dibujable.

    Por ejemplo, esto no tendrá una sombra:

     <LinearLayout android:layout_width="match_parent" android:layout_height="165dp" android:background="@color/ight_grey" android:elevation="20dp" android:orientation="vertical" /> 

    Pero esto

     <LinearLayout android:layout_width="match_parent" android:layout_height="165dp" android:background="@drawable/selector_grey" android:elevation="20dp" android:orientation="vertical" /> 

    EDIT: También han descubierto que si utiliza un selector como fondo, si no tiene el conjunto de la esquina, la sombra no se mostrará en la ventana de vista previa, pero se mostrará en el dispositivo

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

     <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="@color/white" /> <stroke android:width="1dp" android:color="@color/grey"/> </shape> </item> </selector> 

    Pero esto:

     <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="@color/white" /> <corners android:radius="1dp" /> <stroke android:width="1dp" android:color="@color/grey"/> </shape> </item> </selector> 

    La adición de color de fondo me ayudó.

     <CalendarView android:layout_width="match_parent" android:id="@+id/calendarView" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_height="wrap_content" android:elevation="5dp" android:background="@color/windowBackground" /> 

    Si está agregando elevación a un elemento de botón, debe agregar

    "Android: stateListAnimator =" @ null "

    Ver Android 5.0 android: elevación Funciona para ver, pero no el botón?

    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 del teléfono está activada

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

    Así que incluso después de establecer

     android:outlineProvider="bounds" 

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

    Si quieres tener un fondo transparente y android:outlineProvider="bounds" no funciona para ti, puedes 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 establezca este proveedor en su vista transparente:

     transparentView.setOutlineProvider(new TransparentOutlineProvider()); 

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

    [EDIT] Documentación de Drawable.getAlpha () dice que es específico de cómo las amenazas Drawable el 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 color predeterminado # DDFF0000 que está con alpha DDx0 / FFx0 == 0.86

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

    Creo que su problema se deriva del hecho de que ha aplicado el elemento de elevación a un diseño relativo que rellena a su padre. Su padre copia todas las vistas de los niños dentro de su propio lienzo de dibujo (y es la vista que maneja la sombra del niño). Puede solucionar esto aplicando una propiedad de elevación a la más alta RelativeLayout en su vista xml (la etiqueta raíz).

    A veces como background = "@ color / *" o background = "# ff33 " no funciona, cambio background_color con dibujable, entonces funciona

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.