Android - cień na tekście?

184

Zastanawiam się, jak dodać cień do tekstu w Androidzie?

Mam następujący kod, który jest nakładany na mapę bitową i chciałem być śledzony ...

paint.setColor(Color.BLACK);
paint.setTextSize(55);
paint.setFakeBoldText(false);
paint.setShadowLayer(1, 0, 0, Color.BLACK); //This only shadows my whole view...
Grendizer
źródło
2
Pamiętaj, że musisz mieć ShadowRadius.
2
Powinieneś zaznaczyć odpowiedź @fhucho jako poprawną; Próbowałem zrobić to samo i przegapiłem to po raz pierwszy, gdy zobaczyłem ten post, ponieważ żadna odpowiedź nie została oznaczona jako poprawna. Odpowiedź wielokrotnie oceniana jest myląca, ponieważ nie ma związku z programowym dodawaniem cienia.
areyling

Odpowiedzi:

390

Powinieneś być w stanie dodać styl, taki jak ten (zaczerpnięty z kodu źródłowego dla 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>

A w swoim układzie użyj następującego stylu:

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

Edycja: kod źródłowy można wyświetlić tutaj: https://github.com/google/ringdroid

Edycja2: Aby programowo ustawić ten styl, zrobiłbyś coś takiego (zmodyfikowany z tego przykładu, aby dopasować zasoby ringdroida od góry)

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

Podpis dla setTextAppearanceto

public void setTextAppearance (kontekst kontekstowy, int reszt)

Od: Poziom API 1
Ustawia kolor tekstu, rozmiar, styl, kolor podpowiedzi i kolor podświetlenia z określonego zasobu TextAppearance.

Jim Schubert
źródło
1
Ale OP prosi o niestandardowe widżety!
HRJ
Być może, ale nic nie wskazuje na to, że nie mógł użyć tej metody w ImageView. Zakładałem, że malował bezpośrednio, bo inaczej nie mógł tego pojąć.
Jim Schubert
niesamowite ... dodaje bardzo potrzebnej głębi do standardowej czcionki i sprawia, że ​​wygląda ona 10 razy lepiej na jednolitym tle.
Matt K
@Farhan patrz tutaj: stackoverflow.com/questions/4630440/…
Jim Schubert
2
Naprawdę pomogłem, kciuki w górę bracie
Saad Bilal
72

Możesz to zrobić zarówno w kodzie, jak i XML. Tylko 4 podstawowe rzeczy do ustawienia.

  1. kolor cienia
  2. Shadow Dx - określa przesunięcie cienia w osi X. Możesz podać wartości - / +, gdzie -Dx rysuje cień po lewej stronie tekstu i + Dx po prawej stronie
  3. shadow Dy - określa przesunięcie cienia w osi Y. -Dy określa cień nad tekstem, a + Dy określa poniżej tekstu.
  4. promień cienia - określa stopień rozmycia cienia na krawędziach. Podaj niewielką wartość, jeśli cień musi być widoczny. W przeciwnym razie.

na przykład

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

To rysuje wyraźny cień na lewej dolnej części tekstu. W kodzie możesz dodać coś takiego;

    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
źródło
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>

W powyższym kodzie układu XML widok tekstowy1 ma efekt Cienia w układzie. poniżej znajdują się elementy konfiguracji

android: shadowDx - określa przesunięcie cienia w osi X. Możesz podać wartości - / +, gdzie -Dx rysuje cień po lewej stronie tekstu i + Dx po prawej stronie

android: shadowDy - określa przesunięcie cienia w osi Y. -Dy określa cień nad tekstem, a + Dy określa poniżej tekstu.

android: shadowRadius - określa, o ile cień powinien być rozmazany na krawędziach. Podaj niewielką wartość, jeśli cień musi być widoczny. android: shadowColor - określa kolor cienia


Efekt cienia na Android TextView pragmatycznie

Użyj poniższego fragmentu kodu, aby uzyskać efekt cienia drugiego TextView w sposób pragmatyczny.

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

Wynik :

wprowadź opis zdjęcia tutaj

Hoque MD Zahidul
źródło
3

Jeśli chcesz uzyskać cień podobny do tego, który robi Android w programie uruchamiającym, zarządzamy tymi wartościami. Przydają się, jeśli chcesz tworzyć TextViews, które pojawią się jako widżet bez tła.

android:shadowColor="#94000000"
android:shadowDy="2"
android:shadowRadius="4"
Roc Boronat
źródło
2

Narysuj 2 teksty: jeden szary (będzie to cień), a na nim narysuj drugi tekst (y koordynuj o 1px więcej niż cień).

fucho
źródło
1
Dzięki chłopaki za wasze posty. Rozwiązałem go, używając dwóch obiektów malarskich i używając setShadaowLayer na jednym z obiektów malarskich.
Grendizer
2
Może to wyglądać dobrze, jeśli używasz alfa, ale nie będzie wyglądać jak ładny, miękki, deklaratywnie ustawiony cień.
ShibbyUK
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>

następnie użyj jako

 <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
źródło