我们如何在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>
Run Code Online (Sandbox Code Playgroud)
我似乎无法在这些地方指定"1dip".有没有办法做到这一点,除了在代码中设置它们并自己进行设备密度乘法?
谢谢
Dmi*_*nko 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();
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
用法示例:
<?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>
Run Code Online (Sandbox Code Playgroud)
Gra*_*and 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>
Run Code Online (Sandbox Code Playgroud)
而且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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18272 次 |
| 最近记录: |