TextView:shadowDx/Dy/Radius在倾斜?

use*_*701 18 android

我们如何在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)


Rom*_*Guy 19

不幸的是,这是唯一的方法,对不起:(

  • 如果未指定,则单位始终为px. (13认同)
  • 阴影参数的单位是什么?是 px 、 pt 、 dp 、 sp ... 吗? (2认同)

Gra*_*and 17

正如Romain所说,您无法直接在XML中设置dip值.但是,您仍然可以在XML中执行此操作,而无需在代码中进行混乱的缩放计算.

除了普通文件夹之外values-hdpi,诀窍是要有单独的文件夹values-mdpivalues-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)

  • @hackbod但是根据这个论点,在任何情况下都不能使用密度限定符. (7认同)
  • 我强烈反对这一点.这里有一个基本假设,即存在一组固定的密度,这是不正确的.例如,您尚未指定xhdpi或tvdpi(较新的密度),因此您将无法获得正确的值. (6认同)