如何在dip中指定TextView的shadowDx / Dy / Radius值?现在我有:
<style name="foo">
<item name="android:shadowDx">-1</item>
<item name="android:shadowDy">-1</item>
<item name="android:shadowRadius">1</item>
</style>
我似乎无法在这些地方指定“1dip”。有没有办法做到这一点,除了在代码中设置它们并自己进行设备密度乘法?
由于
答案 0 :(得分:24)
我使用自定义xml属性重写了一个TextView,以方便的方式处理它。
哪个库也可用: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>
答案 1 :(得分:19)
不幸的是,这是唯一的方法,抱歉:(
答案 2 :(得分:17)
正如Romain所说,您不能直接在XML中设置dip值。但是,您仍然可以使用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>