studio - xml shadow android




Android "elevação" não mostrando uma sombra (12)

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

Eu tenho um ListView, e com cada item da lista eu quero mostrar uma sombra abaixo dele. Eu estou usando o novo recurso de elevação do Android Lollipop para definir um Z na Visualização que eu quero lançar uma sombra, e já estou fazendo isso efetivamente com o ActionBar (tecnicamente uma barra de ferramentas no Lollipop). Eu estou usando a elevação do Lollipop, mas por alguma razão não está mostrando uma sombra sob os itens da lista. Aqui está como o layout de cada item da lista está 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 mostra o item da lista, sem sombra:

Eu também tentei o seguinte sem sucesso:

  1. Defina a elevação para o ImageView e TextViews em vez do layout pai.
  2. Aplicou um plano de fundo ao ImageView.
  3. Usado TranslationZ no lugar de Elevação.

Acredito que o seu problema decorre do fato de você ter aplicado o elemento de elevação a um layout relativo que preenche seu pai. Seu pai clipe todas as vistas de criança dentro de sua própria tela 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 RelativeLayout mais alto em sua view xml (a tag raiz).


Aparentemente, você não pode simplesmente definir uma elevação em uma Visualização e fazer com que apareça. Você também precisa especificar um plano de fundo.

As seguintes linhas adicionadas ao meu LinearLayout finalmente mostraram uma sombra:

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

Eu estive brincando com sombras no Lollipop por um tempo e foi isso que eu encontrei:

  1. Parece que os limites de um ViewGroup pai ViewGroup a sombra de seus filhos por algum motivo; e
  2. sombras configuradas com android:elevation é cortada pelos limites do View , não pelos limites estendidos pela margem;
  3. o caminho certo para obter uma exibição filho para mostrar sombra é definir o preenchimento no pai e definir android:clipToPadding="false" nesse pai.

Aqui está minha sugestão para você com base no que eu sei:

  1. Defina seu RelativeLayout nível superior para que o preenchimento seja igual às margens definidas no layout relativo que você deseja mostrar.
  2. set android:clipToPadding="false" no mesmo RelativeLayout ;
  3. Remova a margem do RelativeLayout que também possui o conjunto de elevação;
  4. [EDIT] você também pode precisar definir uma cor de fundo não transparente no layout filho que precisa de elevação.

No final do dia, seu layout relativo de nível superior deve ficar 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 interno deve ter esta aparência:

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

No meu caso, as fontes eram o problema.

1) Sem fontFamily eu precisava definir android:background para algum valor.

<TextView
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:background="@android:color/white"
    android:elevation="3dp"
    android:gravity="center"
    android:text="@string/fr_etalons_your_tickets"
    android:textAllCaps="true"
    android:textColor="@color/blue_4" />

2) com fontFamily eu tive que adicionar a android:outlineProvider="bounds" :

<TextView
    android:fontFamily="@font/gilroy_bold"
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:background="@android:color/white"
    android:elevation="3dp"
    android:gravity="center"
    android:outlineProvider="bounds"
    android:text="@string/fr_etalons_your_tickets"
    android:textAllCaps="true"
    android:textColor="@color/blue_4" />

No meu caso, isso foi causado por um componente pai personalizado definindo o tipo de camada de renderização como "Software":

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Removendo esta linha de fazer o truque. Ou claro, você precisa avaliar por que isso está lá, em primeiro lugar. No meu caso, foi para apoiar o Honeycomb, que está bem atrás do SDK mínimo atual para o meu projeto.



Se você quiser ter fundo transparente e o android:outlineProvider="bounds" não funcionar para você, você pode criar o 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);
    }
}

E defina esse provedor para sua exibição transparente:

transparentView.setOutlineProvider(new TransparentOutlineProvider());

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

[EDIT] Documentação de Drawable.getAlpha () diz que é específico para como o Drawable ameaça o alpha. É possível que ele sempre retorne 255. Nesse caso, você pode fornecer o 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);
    }
}

Se o seu fundo de visão é um StateListDrawable com cor padrão # DDFF0000 que é com alpha DDx0 / FFx0 == 0,86

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

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

android:outlineProvider="bounds"

Se você tem uma visão com fundo esta linha irá ajudá-lo

android:outlineProvider="paddedBounds"

Somando-se a resposta aceita, há mais uma razão devido a qual elevação pode não funcionar como esperado.

Se o recurso de filtro Bluelight no telefone estiver ativado

Eu estava enfrentando esse problema quando a elevação parecia completamente distorcida e insuportável no meu dispositivo. Mas a elevação estava bem na pré-visualização. Desligar o filtro Bluelight no telefone resolveu o problema.

Então, mesmo depois de definir

android:outlineProvider="bounds"

A elevação não está funcionando corretamente, então você pode tentar mexer nas configurações de cor do telefone.


Uma outra coisa que você deve estar ciente, as sombras não serão exibidas se você tiver essa linha no manifesto:

android: hardwareAccelerated = "false"

Eu tentei todas as coisas sugeridas, mas só funcionou para mim quando eu removi a linha, a razão que eu tinha a linha era porque o meu aplicativo funciona com um número de imagens de bitmap e eles estavam causando o aplicativo falhar.


dar alguma cor de fundo ao layout trabalhado para mim como:

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






android-elevation