首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TextView:shadowDx/Dy/Radius in dip?

TextView:shadowDx/Dy/Radius in dip?
EN

Stack Overflow用户
提问于 2011-02-01 03:06:09
回答 3查看 20.1K关注 0票数 18

如何在dip中指定TextView的shadowDx/Dy/Radius值?现在我有:

代码语言:javascript
复制
<style name="foo">
  <item name="android:shadowDx">-1</item>
  <item name="android:shadowDy">-1</item>
  <item name="android:shadowRadius">1</item>
</style>

我似乎不能在这些地方指定"1dip“。除了在代码中设置它们并自己进行设备密度乘法之外,还有什么方法可以做到吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-01 03:19:33

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

票数 19
EN

Stack Overflow用户

发布于 2012-09-05 17:32:08

我创建了一个带有自定义xml属性的重写TextView,以便以一种方便的方式处理此问题。

它也可以作为库使用:https://github.com/rongi/text-view-shadow-dips

代码语言:javascript
复制
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();
}

"values“资源文件夹中的attrs.xml

代码语言:javascript
复制
<?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>

使用示例:

代码语言:javascript
复制
<?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>
票数 24
EN

Stack Overflow用户

发布于 2011-04-25 16:57:44

正如Romain所说,您不能直接在XML中设置dip值。不过,您仍然可以在XML中执行此操作,而不必在代码中进行繁琐的缩放计算。

诀窍是除了普通的values文件夹之外,还要有单独的values-hdpivalues-mdpivalues-ldpi文件夹。在每个元素中,创建一个单独的styles.xml,其中包含应用了阴影的文本样式。

例如,您可以在values-mdpi/styles.xml中使用以下代码

代码语言:javascript
复制
<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中,您具有相同的样式,但值按更高的密度进行了缩放:

代码语言:javascript
复制
<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>
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4854935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档