Ответ 1
К сожалению, единственный способ, извините: (
Как мы можем указать значения 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" в этих местах. Есть ли способ сделать это иначе, чем устанавливать их в коде и выполнять самопроизвольное умножение плотности устройства?
Спасибо
К сожалению, единственный способ, извините: (
Я создал переопределенный 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>
Как говорит Ромен, вы не можете устанавливать значения 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>