TextView: shadowDx/Dy/Radius in dip?

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

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

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

Спасибо

Ответ 1

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

Ответ 2

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

public class TextViewShadowDips extends TextView {

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

        final TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.TextViewShadowDips);
        final float shadowRadius = attributes.getDimension(R.styleable.TextViewShadowDips_shadowRadius, 0f);
        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="2dip"
        app:shadowDx="2dip"
        app:shadowDy="2dip"
        />

</RelativeLayout>

Ответ 3

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

В дополнение к обычной папке values у вас есть отдельные папки values-hdpi, values-mdpi и values-ldpi. Внутри каждого создайте отдельный 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>