Tengo un ListView, y con cada elemento de la lista quiero que muestre una sombra debajo de él. Estoy usando la nueva función de elevación de Android Lollipop para establecer una Z en la vista en la que quiero proyectar una sombra, y ya lo estoy haciendo de manera efectiva con la barra de acciones (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. Así es como 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, así es como muestra el elemento de la lista, sin sombra:
También he intentado lo siguiente en vano:
- Establezca la elevación en ImageView y TextViews en lugar del diseño primario.
- Aplica un fondo a ImageView.
- TranslationZ usado en lugar de elevación.
android
material-design
shadow
android-elevation
AggieDev
fuente
fuente
Respuestas:
He estado jugando con sombras en Lollipop durante un tiempo y esto es lo que he encontrado:
ViewGroup
los límites de un padre cortan la sombra de sus hijos por alguna razón; yandroid:elevation
son cortadas por losView
límites de s, no los límites extendidos a través del margen;android:clipToPadding="false"
en ese elemento primario.Aquí está mi sugerencia basada en lo que sé:
RelativeLayout
para que tenga un relleno igual a los márgenes que ha establecido en el diseño relativo que desea mostrar sombra;android:clipToPadding="false"
en el mismoRelativeLayout
;RelativeLayout
que también tiene un conjunto de elevación;Al final del día, su diseño relativo de nivel superior debería verse así:
El diseño relativo interior debería verse así:
fuente
Si tiene una vista sin fondo, esta línea lo ayudará
De forma predeterminada, la sombra está determinada por el fondo de la vista, por lo que si no hay fondo, tampoco habrá sombra.
fuente
<solid>
.none
. ¡Gracias!Aparentemente, no puede simplemente establecer una elevación en una Vista y hacer que aparezca. También debe especificar un fondo.
Las siguientes líneas agregadas a mi LinearLayout finalmente mostraron una sombra:
fuente
Otra cosa que debe tener en cuenta, las sombras no se mostrarán si tiene esta línea en el manifiesto:
android: hardwareAccelerated = "false"
Intenté todas las cosas sugeridas, pero solo 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 varias imágenes de mapa de bits y estaban causando que la aplicación se bloqueara.
fuente
android:clipToPadding="false"
con esta solución.Si tiene una vista sin fondo, esta línea lo ayudará
Si tiene una vista con fondo, esta línea lo ayudará
fuente
android:outlineProvider="paddedBounds"
Esta línea me funcionó. Configuré Selector Drawable.Si agrega elevación a un elemento de botón, debe agregar la siguiente línea:
Ver Android 5.0 android: la elevación funciona para ver, pero no para el botón.
fuente
Ugh, acabo de pasar una hora tratando de resolver esto. En mi caso tenía un conjunto de fondo, sin embargo, estaba configurado en un color. Esto no es suficiente, debe tener el fondo de la vista establecido en dibujable.
Por ejemplo, esto no tendrá sombra:
pero esto lo hará
EDITAR: también descubrí que si usa un selector como fondo, si no tiene la esquina configurada, la sombra no se mostrará en la ventana Vista previa, pero se mostrará en el dispositivo
Por ejemplo, esto no tiene una sombra en la vista previa:
pero esto hace:
fuente
Agregar color de fondo me ayudó.
fuente
A veces me gusta
background="@color/***"
obackground="#ff33**"
no funciona, lo reemplazobackground_color
con dibujable, luego funcionafuente
Si aún no muestra elevación, intente
esto definitivamente te ayudará.
fuente
Si desea tener un fondo transparente y
android:outlineProvider="bounds"
no funciona para usted, puede crear ViewOutlineProvider personalizado:Y configure este proveedor en su vista transparente:
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:
Si su fondo de vista es un StateListDrawable con el color predeterminado # DDFF0000 que es con alfa DDx0 / FFx0 == 0.86
fuente
dar un poco de color de fondo al diseño me funcionó como:
fuente
Tuve un poco de suerte con la configuración
clipChildren="false"
del diseño principal.fuente
Pasé algún tiempo trabajando en ello y finalmente me di cuenta de que cuando el fondo es oscuro, la sombra no es visible
fuente
Además de la respuesta aceptada, hay una razón más por la cual la elevación puede no funcionar como se espera si la función de filtro Bluelight en el teléfono está activada.
Estaba enfrentando este problema cuando la elevación parecía completamente distorsionada e insoportable en mi dispositivo. Pero la elevación estaba bien en la vista previa. Desactivar el filtro Bluelight en el teléfono resolvió el problema.
Entonces, incluso después de configurar
La elevación no funciona correctamente, entonces puede intentar modificar la configuración de color del teléfono.
fuente
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 padre recorta todas las vistas secundarias 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 en la parte superior
RelativeLayout
de su vista xml (la etiqueta raíz).fuente
En mi caso, las fuentes eran el problema.
1) Sin
fontFamily
que necesitaba establecerandroid:background
algún valor.2) con
fontFamily
tuve que agregarandroid:outlineProvider="bounds"
configuración:fuente
En mi caso, esto fue causado por un componente padre personalizado que configura el tipo de capa de representación en "Software":
Eliminar esta línea hizo el truco. O, por supuesto, debe evaluar por qué esto está allí en primer lugar. En mi caso, fue para admitir Honeycomb, que está muy por detrás del SDK mínimo actual para mi proyecto.
fuente
Compruebe también si no cambia alfa en esa vista. Estoy investigando un problema cuando cambio alfa en algunas vistas, con elevación. Simplemente pierden elevación cuando se cambia alfa y se vuelve a cambiar a 1f.
fuente