Eu tenho um ListView e, com cada item da lista, quero que ele mostre uma sombra abaixo dele. Estou usando o novo recurso de elevação do Android Lollipop para definir um Z na visualização que quero projetar uma sombra e já estou fazendo isso de forma eficaz com o ActionBar (tecnicamente uma barra de ferramentas no Lollipop). Estou usando a elevação do Lollipop, mas por algum motivo ele não está mostrando uma sombra nos itens da lista. Aqui está como o layout de cada item da lista é configurado:
<?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>
No entanto, aqui está como ele mostra o item da lista, sem sombra:
Eu também tentei o seguinte sem sucesso:
- Defina a elevação para os próprios ImageView e TextViews, em vez do layout pai.
- Aplicou um plano de fundo ao ImageView.
- TranslationZ usado no lugar de Elevation.
android
material-design
shadow
android-elevation
AggieDev
fonte
fonte
Respostas:
Eu brinco com sombras no Lollipop há um tempo e é isso que eu descobri:
ViewGroup
os limites de um pai cortam a sombra de seus filhos por algum motivo; eandroid:elevation
são cortadas pelosView
limites do, não os limites estendidos pela margem;android:clipToPadding="false"
esse pai.Aqui está minha sugestão para você, com base no que eu sei:
RelativeLayout
para que o preenchimento seja igual às margens definidas no layout relativo que você deseja mostrar sombra;android:clipToPadding="false"
no mesmoRelativeLayout
;RelativeLayout
que também possui elevação definida;No final do dia, seu layout relativo de nível superior deve ficar assim:
O layout relativo interno deve ficar assim:
fonte
Se você tem uma visão sem fundo, esta linha o ajudará
Por padrão, a sombra é determinada pelo plano de fundo da visualização; portanto, se não houver plano de fundo, também não haverá sombra.
fonte
<solid>
.none
. Obrigado!Aparentemente, você não pode simplesmente definir uma elevação em uma vista e fazer com que ela apareça. Você também precisa especificar um plano de fundo.
As seguintes linhas adicionadas ao meu LinearLayout finalmente mostraram uma sombra:
fonte
outra coisa que você deve estar ciente: as sombras não serão exibidas se você tiver esta linha no manifesto:
android: hardwareAccelerated = "false"
Eu tentei todas as coisas sugeridas, mas só funcionou para mim quando removi a linha, a razão pela qual eu tinha a linha era porque meu aplicativo trabalha com várias imagens de bitmap e elas estavam causando a falha do aplicativo.
fonte
android:clipToPadding="false"
com esta solução.Se você tem uma visão sem fundo, esta linha o ajudará
Se você tem uma visão com plano de fundo, esta linha o ajudará
fonte
android:outlineProvider="paddedBounds"
essa linha funcionou para mim. Defino o Seletor Drawable.Se você estiver adicionando elevação a um elemento de botão, precisará adicionar a seguinte linha:
Ver Android 5.0 android: elevação funciona para o View, mas não para o Button?
fonte
Ugh, apenas passei uma hora tentando descobrir isso. No meu caso, eu tinha um conjunto de plano de fundo, no entanto, estava definido como uma cor. Isso não é suficiente, você precisa ter o plano de fundo da visualização definido como um drawable.
Por exemplo, isso não terá sombra:
mas isso vai
EDIT: Também descobriram que, se você usar um seletor como plano de fundo, se não tiver o canto definido, a sombra não aparecerá na janela Visualizar, mas aparecerá no dispositivo
Por exemplo, isso não tem sombra na visualização:
mas isso faz:
fonte
Adicionar cor de fundo me ajudou.
fonte
Às vezes gosto
background="@color/***"
oubackground="#ff33**"
não funciona, substituobackground_color
por drawable, depois funcionafonte
Se ainda não mostrar elevação, tente
isso definitivamente irá ajudá-lo.
fonte
Se você deseja ter um plano de fundo transparente e
android:outlineProvider="bounds"
não funcionar, crie um ViewOutlineProvider personalizado:E defina esse provedor para sua visão transparente:
Fontes: https://code.google.com/p/android/issues/detail?id=78248#c13
[EDIT] A documentação de Drawable.getAlpha () diz que é específico de como o Drawable ameaça o alfa. É possível que ele sempre retorne 255. Nesse caso, você pode fornecer o alfa manualmente:
Se o plano de fundo da visualização for um StateListDrawable com a cor padrão # DDFF0000, com alfa DDx0 / FFx0 == 0,86
fonte
dê alguma cor de fundo ao layout que funcionou para mim como:
fonte
Tive alguma sorte com a configuração
clipChildren="false"
no layout dos pais.fonte
Passei algum tempo trabalhando nisso e finalmente percebi que quando o fundo está escuro, a sombra não é visível
fonte
Além da resposta aceita, há mais um motivo pelo qual a elevação pode não funcionar conforme o esperado, se o recurso de filtro Bluelight no telefone estiver ligado.
Eu estava enfrentando esse problema quando a elevação parecia completamente distorcida e insuportável no meu dispositivo. Mas a elevação foi boa na visualização. Desligar o filtro Bluelight no telefone resolveu o problema.
Então, mesmo depois de definir
A elevação não está funcionando corretamente, então você pode tentar mexer nas configurações de cores do telefone.
fonte
Acredito que seu problema decorra do fato de você ter aplicado o elemento de elevação a um layout relativo que preenche seu pai. Seu pai corta todas as vistas filho dentro de sua própria tela de desenho (e é a vista que lida com a sombra da criança). Você pode corrigir isso aplicando uma propriedade de elevação na parte superior do
RelativeLayout
xml da visualização (a marca raiz).fonte
No meu caso, as fontes eram o problema.
1) Sem
fontFamily
eu precisava definirandroid:background
com algum valor.2) com
fontFamily
eu tive que adicionarandroid:outlineProvider="bounds"
configuração:fonte
No meu caso, isso foi causado por um componente pai personalizado configurando o tipo de camada de renderização para "Software":
Remover esta linha de fez o truque. Ou, é claro, você precisa avaliar por que isso ocorre em primeiro lugar. No meu caso, era oferecer suporte ao Honeycomb, que está bem atrás do SDK mínimo atual do meu projeto.
fonte
Verifique também se Você não altera o alfa nessa exibição. Estou investigando o problema quando altero o alfa em algumas visualizações, com elevação. Eles simplesmente perdem a elevação quando o alfa é alterado e alterado novamente para 1f.
fonte