2010-03-21 14 views
155

Mi chiedo come aggiungere ombra al testo in Android?Android - ombra sul testo?

Ho il seguente codice che viene applicato su una bitmap e volevo essere in ombra ...

paint.setColor(Color.BLACK); 
paint.setTextSize(55); 
paint.setFakeBoldText(false); 
paint.setShadowLayer(1, 0, 0, Color.BLACK); //This only shadows my whole view... 

grato per eventuali suggerimenti!

+2

Si dovrebbe segnare la risposta @fhucho sinistra come la risposta corretta; Stavo cercando di fare la stessa cosa e ho perso la prima volta che ho visto questo post, in quanto nessuna risposta è stata contrassegnata come corretta. La risposta più volte è fuorviante, in quanto non si riferisce all'aggiunta dell'ombra a livello di codice. – areyling

+2

Ricorda che devi avere un ShadowRadius. –

+0

Possibile duplicato di [Aggiungi opaco "ombra" (struttura) ad Android TextView] (http://stackoverflow.com/questions/39106454/add-opaque-shadow-outline-to-android-textview) –

risposta

342

Si dovrebbe essere in grado di aggiungere lo stile, come questo (preso dal codice sorgente per 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 nel layout, utilizzare lo stile come questo:

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

Edit : il codice sorgente può essere visualizzato qui: https://github.com/google/ringdroid

Edit2: Per impostare questo stile a livello di codice, si dovrebbe fare qualcosa di simile (modificato da this example far corrispondere le risorse di Ringdroid dall'alto)

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

La firma per setTextAppearance è

pubblico setTextAppearance void (contesto Context, int resid)

dal: Livello API 1
imposta il testo colore, dimensione, stile, colore suggerimento e colore di evidenziazione dalla risorsa TextAppearance specificata.

+1

Ma l'OP chiede widget personalizzati! – HRJ

+0

Può darsi, ma non c'è nulla che suggerisca che non possa usare questo metodo su un ImageView. Supponevo che dipingesse direttamente perché altrimenti non riusciva a capirlo. –

+3

Come possiamo applicare "style =" @ style/AudioFileInfoOverlayText "" attraverso il codice ???? – Farhan

1

Disegna 2 testi: uno grigio (sarà l'ombra) e sopra di esso si disegna il secondo testo (si coordinano 1 pixel in più di testo ombra).

+1

Grazie ragazzi per i tuoi post . L'ho risolto utilizzando due oggetti paint e utilizzando setShadaowLayer su uno degli oggetti paint. – Grendizer

+2

Questo potrebbe sembrare ok se usi alpha, ma non assomigli all'ombra piacevole, morbida e dichiarativa. – ShibbyUK

60

Si può fare sia in codice che in XML. Solo 4 cose di base da impostare.

  1. colore dell'ombra
  2. ombra Dx - specifica l'offset dell'ombra X-asse. Puoi dare valori -/+, dove -Dx disegna un'ombra a sinistra del testo e + Dx a destra
  3. shadow Dy - specifica l'offset dell'asse Y dell'ombra. -Dy specifica un'ombra sopra il testo e + Dy specifica sotto il testo.
  4. raggio dell'ombra - specifica la quantità di ombra che deve essere sfocata ai bordi. Fornire un piccolo valore se l'ombra deve essere prominente. Altrimenti altrimenti.

ad es.

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

Questo disegna un'ombra prominente sul lato inferiore sinistro del testo. Nel codice, è possibile aggiungere qualcosa come questo;

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)); 
2

Se si desidera ottenere un'ombra simile a quella utilizzata da Android nel Launcher, stiamo gestendo questi valori. Sono utili se vuoi creare TextView che apparirà come un Widget, senza uno sfondo.

android:shadowColor="#94000000" 
android:shadowDy="2" 
android:shadowRadius="4" 
0
<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> 

quindi utilizzare come

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