在ColorStateList中使用android:drawable

时间:2017-09-14 19:17:00

标签: android xamarin.android

为分享按钮创建ColorStateList时,我首先使用android:drawable指定item颜色,如此(偶然)

<item android:state_pressed="true" android:drawable="@color/stock_orange"/>

代替android:color(如“普通”)

 <item android:state_pressed="true" android:color="@color/stock_orange"/>

虽然没有发生碰撞并且按下时发生颜色变化,但它的颜色是错误的(洋红色而不是指定的橙色)。

对此有明显的解释吗?可以/应该在颜色状态列表中使用drawable吗?

资源/颜色/ share_btn_color_state_list.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:state_enabled="false" android:color="#A0A0A0"/>
  <!--QUESTION: works, but color is magenta, not orange -->
  <!--item android:state_pressed="true" android:drawable="@color/stock_orange"/-->
  <item android:state_pressed="true" android:color="@color/stock_orange"/>
  <item android:color="@color/black"/>

</selector>

资源/布局/ share_view.xml

<ImageView
    android:id="@+id/share_btn_iv"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:background="@drawable/ic_share_black_24dp"/>

用法

_shareButton = FindViewById<ImageView>(Resource.Id.share_btn_iv);
_shareButton.Enabled = true;
_shareButton.Drawable.SetTintList(
    ColorStateList.CreateFromXml(
        Resources, 
        Resources.GetXml(Resource.Color.share_btn_color_state_list)
    )
);

2 个答案:

答案 0 :(得分:1)

  

在ColorStateList中绘制

一种方法是自定义ImageView并使用ColorFilterColorStateList的组合,其中包含按下按钮时的色调颜色。

使用根据新状态设置色调的代码扩展ImageView并包装DrawableStateChanged()

public class TintableImageView : ImageView
{
    private ColorStateList tint;

    public TintableImageView(Context context) : base(context)
    {
    }

    public TintableImageView(Context context, IAttributeSet attrs):base(context,attrs)
    {
        init(context, attrs, 0);
    }

    public TintableImageView(Context context, IAttributeSet attrs, int defStyle):base(context,attrs,defStyle)
    {
        init(context, attrs, defStyle);
    }

    private void init(Context context, IAttributeSet attrs, int defStyle)
    {
        TypedArray a = context.ObtainStyledAttributes(attrs, Resource.Styleable.TintableImageView, defStyle, 0);
        tint = a.GetColorStateList(Resource.Styleable.TintableImageView_tint);
        a.Recycle();
    }

    protected override void DrawableStateChanged()
    {
        base.DrawableStateChanged();
        if(tint != null && tint.IsStateful)
        {
            UpdateTintColor();
        }
    }

    public void SetColorFilter(ColorStateList tint)
    {
        this.tint = tint;
        base.SetColorFilter(new Color(tint.GetColorForState(GetDrawableState(), new Color(0))));
    }

    private void UpdateTintColor()
    {
        var color = new Color(tint.GetColorForState(GetDrawableState(), new Color(0)));
        SetColorFilter(color);
    }
}

定义自定义属性:

attrs.xml

<?xml version="1.0" encoding="UTF-8"?>
<resources>

    <declare-styleable name="TintableImageView">
        <attr name="tint" format="reference|color" />
    </declare-styleable>

</resources>

这样的颜色选择器: Resource \ Color \ color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true" android:color="@color/colorAccent"/>
  <item android:color="#00000000"/>
</selector>    

使用此自定义ImageView;

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

 <ImageDemo.TintableImageView
    android:id="@+id/myImageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/download"
    app:tint="@color/color_selector"
    android:clickable="true"/>

</LinearLayout>

编辑:

例如,添加半透明颜色作为颜色效果:

<强>资源\颜色\ color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true" android:color="#55000000"/>
  <item android:color="#00000000"/>
</selector>    

效果:

enter image description here

答案 1 :(得分:0)

通常,颜色状态列表用于更改不同状态的任何ui元素的颜色。例如,Button小部件可以存在于几种不同状态之一(按下,聚焦或两者都没有),并使用颜色状态列表,你可以在每个州提供不同的颜色。

StateListDrawable是一个XML格式的可绘制对象,它使用几个不同的图像来表示相同的图形,具体取决于对象的状态。例如,Button小部件可以存在于几种不同状态之一(按下,聚焦或两者都没有),并且使用状态列表drawable,您可以为每个状态提供不同的背景图像。

虽然你做了什么但是它不是推荐的方法