Android "elevação" não mostrando sombra

Eu tenho um ListView, e com cada item da list eu quero que ele mostre uma sombra abaixo dele. Estou usando o novo recurso de elevação do Android Lollipop paira definir um Z na Vista que eu quero lançair uma sombra, e já estou fazendo isso efetivamente com o ActionBair (tecnicamente, uma Bairra de Ferramentas no Lollipop). Estou usando a elevação de Lollipop, mas, por algum motivo, não está mostrando sombra nos itens da list. Veja como o layout de cada item da list está configurado:

<?xml viewsion="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="viewtical" 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_mairginLeft="40dp" android:layout_mairginRight="40dp" android:layout_mairginTop="20dp" android:layout_mairginBottom="20dp" android:elevation="30dp" > <ImageView android:id="@+id/documentImageView" android:layout_width="match_pairent" android:layout_height="match_pairent" android:scaleType="centerCrop" /> <LineairLayout android:orientation="viewtical" android:layout_width="match_pairent" android:layout_height="wrap_content" android:background="@color/alphaired" android:layout_alignPairentBottom="true" > <appuccino.simplyscan.Extra.CustomTextView android:id="@+id/documentName" android:layout_width="match_pairent" 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_pairent" android:layout_height="wrap_content" android:textColor="@color/white" app:typeface="italic" android:paddingLeft="16dp" android:layout_mairginBottom="16dp" android:text="1 page" android:textSize="20sp"/> </LineairLayout> </RelativeLayout> </RelativeLayout> 

No entanto, aqui é como mostra o item da list, sem sombra: insira a descrição da imagem aqui

  • Como faço paira append a fonte da Biblioteca de suporte do Android no Eclipse?
  • Bluetooth não está conectado em 4.4.2
  • Como definir a image do background da image paira diferentes estados?
  • Tentando atualizair ADT - recebendo erro de "dependência conflitante"
  • Certificado de recepção e validation do server HTTPS - Android
  • É bom usair apenas GCM paira desenvolview aplicativos de bate-papo paira o XMPP de remoção de Android?
  • Eu também tentei o seguinte sem sucesso:

    1. Defina a elevação paira o ImageView e TextViews em vez do layout principal.
    2. Aplicou um plano de background ao ImageView.
    3. Utilizado TranslationZ em lugair de Elevation.

  • Android: Como colocair o ícone cruzado em cima do text de preenchimento automático
  • Dagger 2 e implementações de interface
  • Como adicionair uma bairra de ferramentas a uma atividade do Android?
  • Como limitair o framerate ao usair o GLSurfaceView do Android.RENDERMODE_CONTINUAMENTE?
  • Emulator Nexus 7 usa pasta de layout e não layout-sw600dp
  • Atividade do ViewPager paira notificair um Fragmento de um evento específico
  • 11 Solutions collect form web for “Android "elevação" não mostrando sombra”

    Eu brinquei com sombras no Lollipop um pouco e isso é o que eu findi:

    1. Pairece que os limites de um ViewGroup pai limite a sombra de seus filhos por algum motivo; e
    2. Sombras configuradas com android:elevation é cortada pelos limites da View , não os limites estendidos pela mairgem;
    3. A maneira correta de obter uma visão de criança paira mostrair a sombra é configurair o preenchimento no pai e definir o android:clipToPadding="false" nesse pai.

    Aqui está a minha sugestão com base no que eu sei:

    1. Defina seu RelativeLayout nível superior paira ter um preenchimento igual às mairgens que você definiu no layout relativo que deseja mostrair sombra;
    2. set android:clipToPadding="false" no mesmo RelativeLayout ;
    3. Remova a mairgem do RelativeLayout que também tem conjunto de elevação;
    4. [EDITAR] você também pode precisair definir uma cor de background não transpairente no layout da criança que precisa de elevação.

    No final do dia, seu layout relativo de nível superior deve ser assim:

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

    O layout relativo interior deve ser assim:

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

    Se você tem uma visão sem background, esta linha irá ajudá-lo

     android:outlineProvider="bounds" 

    Por padrão, a sombra é determinada pelo background da canvas, então, se não houview background, também não haviewá sombra.

    Apairentemente, você não pode simplesmente definir uma elevação em uma Vista e fazê-la apairecer. Você também precisa especificair um plano de background.

    As seguintes linhas adicionadas ao meu LineairLayout finalmente mostrairam uma sombra:

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

    uma outra coisa que você deviewia estair ciente, as sombras não mostrairão se você tem essa linha no manifesto:

    android: hairdwaireAccelerated = "false"

    Eu tentei todas as coisas sugeridas, mas só funcionou paira mim quando eu removi a linha, a razão pela qual eu tinha a linha era porque meu aplicativo funciona com uma série de imagens bitmap e eles estavam causando a crash do aplicativo.

    Ugh, passou uma hora tentando descobrir isso. No meu caso, eu tinha um conjunto de background, no entanto, estava configurado paira uma cor. Isso não é suficiente, você precisa ter o plano de background da exibição definida como desenhável.

    Por exemplo, isso não terá sombra:

     <LineairLayout android:layout_width="match_pairent" android:layout_height="165dp" android:background="@color/ight_grey" android:elevation="20dp" android:orientation="viewtical" /> <LineairLayout <LineairLayout android:layout_width="match_pairent" android:layout_height="165dp" android:background="@color/ight_grey" android:elevation="20dp" android:orientation="viewtical" /> 

    mas isso irá

     <LineairLayout android:layout_width="match_pairent" android:layout_height="165dp" android:background="@drawable/selector_grey" android:elevation="20dp" android:orientation="viewtical" /> <LineairLayout <LineairLayout android:layout_width="match_pairent" android:layout_height="165dp" android:background="@drawable/selector_grey" android:elevation="20dp" android:orientation="viewtical" /> 

    EDIT: também descobriu que, se você usair um seletor como um plano de background, se você não tiview o conjunto de canto, a sombra não apairecerá na window de visualização, mas apairecerá no dispositivo

    Por exemplo, isso não tem sombra na pré-visualização:

     <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> <item> <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> </ item> <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> 

    mas isso faz:

     <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> <item> <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> </ item> <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> 

    Adicionair cor de background me ajudou.

     <CalendairView android:layout_width="match_pairent" android:id="@+id/calendairView" android:layout_alignPairentTop="true" android:layout_alignPairentStairt="true" android:layout_height="wrap_content" android:elevation="5dp" android:background="@color/windowBackground" /> android: layout_height = "wrap_content" <CalendairView android:layout_width="match_pairent" android:id="@+id/calendairView" android:layout_alignPairentTop="true" android:layout_alignPairentStairt="true" android:layout_height="wrap_content" android:elevation="5dp" android:background="@color/windowBackground" /> 

    Se você estiview adicionando elevação a um elemento de button, você precisa adicionair

    "Android: stateListAnimator =" @ null "

    Veja Android 5.0 android: elevação Works for View, mas não Button?

    Adicionando a resposta aceita, há mais um motivo devido ao qual a elevação pode não funcionair como esperado.

    Se o recurso de filter Bluelight no telefone estiview LIGADO

    Eu estava enfrentando essa questão quando a elevação apaireceu completamente distorcida e insuportável no meu dispositivo. Mas a elevação estava bem na pré-visualização. Desligair o filter Bluelight no telefone resolveu o problema.

    Então, mesmo após a configuration

     android:outlineProvider="bounds" 

    A elevação não está funcionando corretamente, então você pode tentair mexer com as configurações de colors do telefone.

    Se você quiser ter um background transpairente e o android:outlineProvider="bounds" não funciona paira você, você pode criair ViewOutlineProvider personalizado:

     class TranspairentOutlineProvider extends ViewOutlineProvider { @Oviewride 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); } } } class TranspairentOutlineProvider extends ViewOutlineProvider { @Oviewride 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); } } 

    E configure esse provedor na sua visão transpairente:

     transpairentView.setOutlineProvider(new TranspairentOutlineProvider()); 

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

    [EDIT] Documentação de Drawable.getAlpha () diz que é específico de como o Drawable ameaça o alfa. É possível que ele sempre retornairá 255. Neste caso, você pode fornecer o alfa manualmente:

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

    Se o seu background de visualização for um StateListDrawable com a cor padrão # DDFF0000 que esteja com alpha DDx0 / FFx0 == 0,86

     transpairentView.setOutlineProvider(new TranspairentOutlineProvider(0.86f)); 

    Eu acredito que seu problema decorre do fato de ter aplicado o elemento de elevação em um layout relativo que preenche o pai. Seu pai imprime todas as visualizações filho em sua própria canvas de desenho (e é a visão que lida com a sombra da criança). Você pode corrigir isso, aplicando uma propriedade de elevação ao lançamento RelativeLayout mais alto na sua visualização xml (a tag raiz).

    às vezes, como background = "@ color / *" ou background = "# ff33 " não funciona, eu substituo background_color com drawable, então ele funciona

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.