如何在TextView上使用自定义选择器样式

3
我正在尝试弄清如何在触摸TextView时添加外发光。我采用的方法是使用Selector,但似乎不起作用。
我有以下结构: layout\HomeView.axml
<TextView
    android:id="@+id/textview1"
    android:clickable="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    style="@drawable/control_selector_state" />

drawable\control_selector_state.xml

<!-- yes these are all the same for testing purposes -->

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_focused="true"
        style="@style/control_style_focused"/>

  <item android:state_focused="true"
        android:state_pressed="true"
        style="@style/control_style_focused" />

  <item android:state_pressed="true"
        style="@style/control_style_focused" />

  <item style="@style/control_style_focused" />

</selector>

values\styles.xml

<resources>
  <style name="control_style_focused">
    <item name="android:shadowColor">#0000ff</item>
    <item name="android:textColor">#ff0000</item>
    <item name="android:shadowDx">0.0</item>
    <item name="android:shadowRadius">8</item>
  </style>
</resources>

我遇到的问题是我的TextView文本是白色的,而样式似乎没有应用。

我该如何使这个样式应用到我的TextView上?


将shadowDx设置为0.5,看看会发生什么。0.0会完全将其置于小部件下方。 - Rick Falck
0.0处的阴影是为了模拟发光而不是阴影。 - Chase Florell
这个回答解决了你的问题吗?创建样式选择器 - smac89
1个回答

2

正如@Longwayto所说,选择器样式仅适用于可绘制对象。这并不意味着不可能。

下面是一个有效的方法。

首先,您需要创建一个扩展了TextView的自定义TextView。

public class MyTextView: TextView
{
    private readonly Context _context;

    public FontIconTextView(Context context, IAttributeSet attrs) : base(context)
    {
        _context = context;
        Initialize(attrs);
    }

    private void Initialize(IAttributeSet attrs)
    {
        var a = _context.Theme.ObtainStyledAttributes(attrs, Resource.Styleable.MyTextView, 0, 0);
        _touchGlowColor = a.GetString(Resource.Styleable.MyTextView_TouchGlowColor);
        _touchGlowSize = a.GetInteger(Resource.Styleable.MyTextView_TouchGlowSize, 0);
        Initialize();
    }

    private void Initialize()
    {
        // other initialize stuff happens here...

    }

    private int _touchGlowSize;
    private string _touchGlowColor;
    public override bool OnTouchEvent(MotionEvent motionEvent)
    {
        if (Enabled)
        {
            var color = string.IsNullOrEmpty(_touchGlowColor) ? new Color(255, 255, 255, 255) : Color.ParseColor(_touchGlowColor);

            switch (motionEvent.Action)
            {
                case MotionEventActions.Down:
                    SetShadowLayer(_touchGlowSize, 0, 0, color);
                    break;
                case MotionEventActions.Up:
                case MotionEventActions.Cancel:
                    SetShadowLayer(0, 0, 0, new Color(255, 255, 255, 255));
                    break;

            }
        }
        return base.OnTouchEvent(motionEvent);
    }
}

接下来,您需要进入值目录并指定自定义属性。

Resources\values\CustomBindingAttributes.xml

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <declare-styleable name="MyTextView">
    <attr name="TouchGlowColor" format="string" />
    <attr name="TouchGlowSize" format="integer" />
  </declare-styleable>
</resources>

以上所有内容都可以在您的整个应用程序中重复使用...不再需要在每个视图上重复编写。
最后,这是您的按钮的外观。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- obviously the foo/bar is just to show that you add android attrs like normal -->
    <some.name.space.MyTextView
        android:foo="foo"
        amdroid:bar="bar"
        local:TouchGlowColor="#66e400"
        local:TouchGlowSize="20" />

</LinearLayout>

我遇到的一个问题是将TouchGlowSize设置为30会导致应用程序崩溃。目前不确定原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接