Android - тень на текст?

184

Мне интересно, как добавить тень на текст в Android?

У меня есть следующий код, который применяется к растровому изображению, и я хотел быть затененным ...

paint.setColor(Color.BLACK);
paint.setTextSize(55);
paint.setFakeBoldText(false);
paint.setShadowLayer(1, 0, 0, Color.BLACK); //This only shadows my whole view...
Grendizer
источник
2
Имейте в виду, что у вас должен быть ShadowRadius.
2
Вы должны пометить ответ @fhucho слева как правильный ответ; Я пытался сделать то же самое и пропустил это в первый раз, когда увидел этот пост, так как ни один ответ не был помечен как правильный. Ответ, за который проголосовали много раз, вводит в заблуждение, поскольку он не связан с программным добавлением тени.
Арейлинг

Ответы:

390

Вы должны иметь возможность добавить стиль, как это (взято из исходного кода для 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>

И в вашем макете используйте стиль, подобный этому:

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

Изменить: исходный код можно посмотреть здесь: https://github.com/google/ringdroid

Edit2: чтобы установить этот стиль программно, вы должны сделать что-то вроде этого (изменено из этого примера, чтобы соответствовать ресурсам ringdroid сверху)

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

Сигнатура setTextAppearanceIS

public void setTextAppearance (контекстный контекст, int остаток)

Поскольку: Уровень API 1
Устанавливает цвет текста, размер, стиль, цвет подсказки и цвет выделения из указанного ресурса TextAppearance.

Джим Шуберт
источник
1
Но ОП требует пользовательских виджетов!
HRJ
Это может быть, но нет ничего, чтобы предположить, что он не мог использовать этот метод в ImageView. Я предположил, что он рисовал напрямую, потому что иначе не мог понять.
Джим Шуберт
удивительно ... добавляет необходимую глубину стандартному шрифту и делает его в 10 раз лучше на сплошном фоне.
Мэтт К
@Farhan смотрите здесь: stackoverflow.com/questions/4630440/…
Джим Шуберт,
2
Действительно помог, большие пальцы братан
Саад Билал
72

Вы можете сделать как в коде, так и в XML. Только 4 основных вещи, которые будут установлены.

  1. цвет тени
  2. Shadow Dx - определяет смещение оси X тени. Вы можете задать значения - / +, где -Dx рисует тень слева от текста и + Dx справа
  3. shadow Dy - указывает смещение тени по оси Y. -Dy указывает тень над текстом, а + Dy указывает под текстом.
  4. радиус тени - указывает, насколько тень должна быть размыта по краям. Укажите небольшое значение, если тень должна быть заметной. Остальное иначе.

например

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

Это рисует заметную тень на левой нижней части текста. В коде вы можете добавить что-то вроде этого;

    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
источник
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>

В приведенном выше коде макета XML textview1 имеет эффект Shadow в макете. ниже приведены пункты конфигурации

android: shadowDx - указывает смещение оси X тени. Вы можете задать значения - / +, где -Dx рисует тень слева от текста и + Dx справа

android: shadowDy - указывает смещение тени по оси Y. -Dy указывает тень над текстом, а + Dy указывает под текстом.

android: shadowRadius - указывает, насколько тень должна быть размыта по краям. Укажите небольшое значение, если тень должна быть заметной. android: shadowColor - указывает цвет тени


Эффект тени на Android TextView прагматично

Используйте фрагмент кода ниже, чтобы прагматично получить эффект тени на втором TextView.

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

Вывод :

введите описание изображения здесь

Hoque MD Захидул
источник
3

Если вы хотите получить тень, подобную той, которую Android делает в Launcher, мы управляем этими значениями. Они полезны, если вы хотите создать TextViews, которые будут отображаться как виджет, без фона.

android:shadowColor="#94000000"
android:shadowDy="2"
android:shadowRadius="4"
Рок Боронат
источник
2

Нарисуйте 2 текста: один серый (это будет тень) и поверх него нарисуйте второй текст (координата y на 1 пиксель больше, чем текст тени).

fhucho
источник
1
Спасибо, ребята за ваши посты. Я решил это, используя два объекта рисования и используя setShadaowLayer на одном из объектов рисования.
Grendizer
2
Это может выглядеть нормально, если вы используете альфа, но не будет выглядеть как хорошая, мягкая, декларативно заданная тень.
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>

затем использовать как

 <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"/>
Дэн Алботяну
источник