Android - sombra no texto?

184

Gostaria de saber como adicionar sombra no texto no android?

Eu tenho o seguinte código que é aplicado em um bitmap e eu queria ser sombreado ...

paint.setColor(Color.BLACK);
paint.setTextSize(55);
paint.setFakeBoldText(false);
paint.setShadowLayer(1, 0, 0, Color.BLACK); //This only shadows my whole view...
Grendizer
fonte
2
Lembre-se de que você deve ter um ShadowRadius.
2
Você deve marcar a resposta @fhucho como a resposta correta; Eu estava tentando fazer a mesma coisa e perdi a primeira vez que vi este post, pois nenhuma resposta foi marcada como correta. A resposta votada muitas vezes é enganosa, pois não se refere à adição da sombra programaticamente.
areyling
Possível duplicado de Add opaca "sombra" (esboço) para TextView Android
Juergen d

Respostas:

390

Você deve poder adicionar o estilo, desta forma (extraído do código-fonte do Ringdroid):

  <style name="AudioFileInfoOverlayText">
    <item name="android:paddingLeft">4px</item>
    <item name="android:paddingBottom">4px</item>
    <item name="android:textColor">#ffffffff</item>
    <item name="android:textSize">12sp</item>
    <item name="android:shadowColor">#000000</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
    <item name="android:shadowRadius">1</item>
  </style>

E no seu layout, use o estilo assim:

 <TextView android:id="@+id/info"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       style="@style/AudioFileInfoOverlayText"
       android:gravity="center" />

Editar: o código fonte pode ser visto aqui: https://github.com/google/ringdroid

Edit2: Para definir esse estilo programaticamente, você faria algo assim (modificado neste exemplo para corresponder aos recursos do ringdroid acima)

TextView infoTextView = (TextView) findViewById(R.id.info);
infoTextView.setTextAppearance(getApplicationContext(),  
       R.style.AudioFileInfoOverlayText);

A assinatura para setTextAppearanceé

public void setTextAppearance (Contexto do contexto, int resid)

Desde: API Nível 1
Define a cor, o tamanho, o estilo, a cor da dica e a cor do realce do texto do recurso TextAppearance especificado.

Jim Schubert
fonte
1
Mas o OP está pedindo widgets personalizados!
HRJ 04/02
Pode ser, mas não há nada que sugira que ele não possa usar esse método em um ImageView. Eu assumi que ele estava pintando diretamente porque ele não conseguia descobrir o contrário.
Jim Schubert
awesome ... adiciona a profundidade necessária à fonte padrão e faz com que ela pareça 10X melhor em um fundo sólido.
Matt K
@Farhan veja aqui: stackoverflow.com/questions/4630440/…
Jim Schubert
2
Realmente ajudou, polegares para cima mano
Saad Bilal 25/10
72

Você pode fazer as duas coisas em código e XML. Apenas 4 coisas básicas a serem definidas.

  1. cor da sombra
  2. Shadow Dx - especifica o deslocamento da sombra no eixo X. Você pode fornecer valores - / +, onde -Dx desenha uma sombra à esquerda do texto e + Dx à direita
  3. shadow Dy - especifica o deslocamento da sombra no eixo Y. -Dy especifica uma sombra acima do texto e + Dy especifica abaixo do texto.
  4. raio da sombra - especifica quanto a sombra deve ficar embaçada nas bordas. Forneça um valor pequeno se a sombra precisar ser destacada. Senão, caso contrário.

por exemplo

    android:shadowColor="@color/text_shadow_color"
    android:shadowDx="-2"
    android:shadowDy="2"
    android:shadowRadius="0.01"

Isso desenha uma sombra proeminente no lado inferior esquerdo do texto. No código, você pode adicionar algo como isto;

    TextView item = new TextView(getApplicationContext());
    item.setText(R.string.text);
    item.setTextColor(getResources().getColor(R.color.general_text_color));
    item.setShadowLayer(0.01f, -2, 2,   getResources().getColor(R.color.text_shadow_color));
codeFood
fonte
7
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="20dp" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:shadowColor="#000"
        android:shadowDx="0"
        android:shadowDy="0"
        android:shadowRadius="50"
        android:text="Text Shadow Example1"
        android:textColor="#FBFBFB"
        android:textSize="28dp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/textview2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Text Shadow Example2"
        android:textColor="#FBFBFB"
        android:textSize="28dp"
        android:textStyle="bold" />

</LinearLayout>

No código de layout XML acima, o textview1 é fornecido com o efeito Shadow no layout. abaixo estão os itens de configuração

android: shadowDx - especifica o deslocamento da sombra no eixo X. Você pode fornecer valores - / +, onde -Dx desenha uma sombra à esquerda do texto e + Dx à direita

android: shadowDy - especifica o deslocamento da sombra no eixo Y. -Dy especifica uma sombra acima do texto e + Dy especifica abaixo do texto.

android: shadowRadius - especifica quanto a sombra deve ficar embaçada nas bordas. Forneça um valor pequeno se a sombra precisar ser destacada. android: shadowColor - especifica a cor da sombra


Efeito de sombra no Android TextView de forma pragmática

Use o snippet de código abaixo para obter o efeito de sombra no segundo TextView de forma pragmática.

TextView textv = (TextView) findViewById(R.id.textview2);
textv.setShadowLayer(30, 0, 0, Color.RED);        

Resultado :

insira a descrição da imagem aqui

Hoque MD Zahidul
fonte
3

Se você deseja obter uma sombra como a do Android no Launcher, estamos gerenciando esses valores. Eles são úteis se você deseja criar TextViews que aparecerão como um Widget, sem fundo.

android:shadowColor="#94000000"
android:shadowDy="2"
android:shadowRadius="4"
Roc Boronat
fonte
2

Desenhe 2 textos: um cinza (será a sombra) e, em cima, desenhe o segundo texto (coordenadas y mais 1px que o texto das sombras).

fhucho
fonte
1
Obrigado pessoal por suas postagens. Eu o resolvi usando dois objetos de pintura e usando o setShadaowLayer em um dos objetos de pintura.
quer
2
Pode parecer bom se você usar alfa, mas não parecerá a sombra agradável, suave e definida declarativamente.
ShibbyUK 5/09
2
 <style name="WhiteTextWithShadow" parent="@android:style/TextAppearance">
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
    <item name="android:shadowRadius">1</item>
    <item name="android:shadowColor">@android:color/black</item>
    <item name="android:textColor">@android:color/white</item>
</style>

então use como

 <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            tools:text="Today, May 21"
            style="@style/WhiteTextWithShadow"/>
Dan Alboteanu
fonte