TextView: shadowDx / Dy / Радиус в провале? - PullRequest
18 голосов
/ 31 января 2011

Как мы можем указать значения shadowDx / Dy / Radius в dip для TextView? Прямо сейчас у меня есть:

<style name="foo">
  <item name="android:shadowDx">-1</item>
  <item name="android:shadowDy">-1</item>
  <item name="android:shadowRadius">1</item>
</style>

Я не могу указать "1dip" в этих местах. Есть ли способ сделать это кроме установки их в коде и умножения плотности устройства самостоятельно?

Спасибо

Ответы [ 3 ]

24 голосов
/ 05 сентября 2012

Я сделал переопределенный TextView с пользовательскими атрибутами xml для удобной обработки.

Который также доступен в виде библиотеки: https://github.com/rongi/text-view-shadow-dips

public class TextViewShadowDips extends TextView {

public TextViewShadowDips(Context context, AttributeSet attrs) {
    super(context, attrs);

    final TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.TextViewShadowDips);
    // App can crash on some devices if shadow radius is more than 25 pixels
    // On Samsung Galaxy S6 this crash happens when you copy a text from an input field
    // https://stackoverflow.com/questions/4866928/ranges-for-radius-in-shadowradius-and-visiblity-in-textview?lq=1
    final float shadowRadius = Math.min(
        attributes.getDimension(R.styleable.TextViewShadowDips_shadowRadius, 0f),
        25f
    );
    final float shadowDx = attributes.getDimension(R.styleable.TextViewShadowDips_shadowDx, 0f);
    final float shadowDy = attributes.getDimension(R.styleable.TextViewShadowDips_shadowDy, 0f);
    final int shadowColor = attributes.getColor(R.styleable.TextViewShadowDips_shadowColor, 0);
    if (shadowColor != 0) {
        setShadowLayer(shadowRadius, shadowDx, shadowDy, shadowColor);
    } else {
        getPaint().clearShadowLayer();
    }
    attributes.recycle();
}

attrs.xml внутри папки ресурсов "values"

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="TextViewShadowDips">
        <attr name="shadowRadius" format="dimension"/>
        <attr name="shadowDx" format="dimension"/>
        <attr name="shadowDy" format="dimension"/>
        <attr name="shadowColor" format="color"/>
    </declare-styleable>

</resources>

Пример использования:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <my.package.name.TextViewShadowDips 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:shadowColor="#000000"
        app:shadowRadius="2dp"
        app:shadowDx="2dp"
        app:shadowDy="2dp"
        />

</RelativeLayout>
19 голосов
/ 31 января 2011

К сожалению, это единственный способ, извините: (

17 голосов
/ 25 апреля 2011

Как говорит Ромен, вы не можете устанавливать значения погружения напрямую в XML.Тем не менее, вы можете делать это в XML, не прибегая к беспорядочным вычислениям масштабирования в своем коде.

Хитрость заключается в том, чтобы иметь отдельные папки values-hdpi, values-mdpi и values-ldpi в дополнение кобычная папка values.Внутри каждого создайте отдельный styles.xml, содержащий стиль для вашего текста с примененной тенью.

Например, это может быть в values-mdpi/styles.xml:

<style name="my_shadow">
  <item name="android:shadowDx">0.0</item>
  <item name="android:shadowDy">-1.0</item>
  <item name="android:shadowRadius">1.0</item>
</style>

И в values-hdpi/styles.xml, у вас тот же стиль, но со значениями, масштабированными для более высокой плотности:

<style name="my_shadow">
  <item name="android:shadowDx">0.0</item>
  <item name="android:shadowDy">-1.5</item>
  <item name="android:shadowRadius">1.5</item>
</style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...