187 votes

Android - ombre sur le texte ?

Je me demande comment ajouter une ombre sur un texte dans Android ?

J'ai le code suivant qui est appliqué sur un bitmap et je voulais qu'il soit ombragé...

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

2 votes

N'oubliez pas que vous devez avoir un ShadowRadius.

2 votes

Vous devriez marquer la réponse laissée par @fhucho comme étant la réponse correcte ; j'essayais de faire la même chose et je l'ai manqué la première fois que j'ai vu ce message, car aucune réponse n'était marquée comme correcte. La réponse qui a été votée plusieurs fois est trompeuse, car elle ne concerne pas l'ajout de l'ombre par programme.

0 votes

395voto

Jim Schubert Points 10234

Vous devriez être en mesure d'ajouter le style, comme ceci (tiré du code source de 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>

Et dans votre mise en page, utilisez le style comme ceci :

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

Edit : le code source peut être consulté ici : https://github.com/google/ringdroid

Edit2 : Pour définir ce style par programme, vous feriez quelque chose comme ceci (modifié à partir de cet exemple pour correspondre aux ressources de ringdroid ci-dessus)

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

La signature pour setTextAppearance est

public void setTextAppearance (Context context, int resid)

Depuis : API Niveau 1
Définit la couleur, la taille, le style, la couleur d'accentuation et la couleur de surbrillance du texte à partir de la ressource TextAppearance spécifiée. couleur de surbrillance de la ressource TextAppearance spécifiée.

1 votes

Mais l'OP demande des widgets personnalisés !

0 votes

C'est possible, mais rien ne suggère qu'il ne pourrait pas utiliser cette méthode sur un ImageView. J'ai supposé qu'il peignait directement parce qu'il ne pouvait pas trouver d'autre solution.

0 votes

Génial... il ajoute la profondeur nécessaire à la police standard et la rend 10X meilleure sur un fond solide.

76voto

codeFood Points 251

Vous pouvez faire les deux en code et en XML. Il n'y a que 4 éléments de base à définir.

  1. couleur d'ombre
  2. Shadow Dx - spécifie le décalage de l'ombre sur l'axe X. Vous pouvez donner des valeurs -/+, où -Dx dessine une ombre à gauche du texte et +Dx à droite.
  3. shadow Dy - spécifie le décalage de l'axe Y de l'ombre. -Dy spécifie une ombre au-dessus du texte et +Dy spécifie une ombre au-dessous du texte.
  4. shadow radius - spécifie de combien l'ombre doit être floutée sur les bords. Fournissez une petite valeur si l'ombre doit être proéminente. Sinon, une autre valeur.

par exemple

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

Cela dessine une ombre proéminente sur le côté inférieur gauche du texte. En code, vous pouvez ajouter quelque chose comme ceci ;

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

9voto

Hoque MD Zahidul Points 1101
<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>

Dans le code de mise en page XML ci-dessus, le textview1 est donné avec l'effet Shadow dans la mise en page. Les éléments de configuration ci-dessous sont

Android:shadowDx - spécifie le décalage de l'ombre sur l'axe X. Vous pouvez donner des valeurs -/+, où -Dx dessine une ombre à gauche du texte et +Dx à droite.

Android:shadowDy - il spécifie le décalage de l'axe Y de l'ombre. -Dy spécifie une ombre au-dessus du texte et +Dy spécifie une ombre au-dessous du texte.

Android:shadowRadius - spécifie à quel point l'ombre doit être floutée sur les bords. Fournissez une petite valeur si l'ombre doit être proéminente. Android:shadowColor - spécifie la couleur de l'ombre.


Effet d'ombre sur un TextView Android de manière pragmatique

Utilisez le code ci-dessous pour obtenir l'effet d'ombre sur le deuxième TextView de manière pragmatique.

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

Sortie :

enter image description here

3voto

Roc Boronat Points 5087

Si l'on veut obtenir une ombre comme celle que fait Android dans le Launcher, on gère ces valeurs. Elles sont utiles si vous voulez créer des TextViews qui apparaîtront comme un Widget, sans arrière-plan.

android:shadowColor="#94000000"
android:shadowDy="2"
android:shadowRadius="4"

3voto

Dan Alboteanu Points 1570
 <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>

puis utiliser comme

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X