为分享按钮创建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)
)
);
答案 0 :(得分:1)
在ColorStateList中绘制
一种方法是自定义ImageView
并使用ColorFilter
和ColorStateList
的组合,其中包含按下按钮时的色调颜色。
使用根据新状态设置色调的代码扩展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>
效果:
答案 1 :(得分:0)
通常,颜色状态列表用于更改不同状态的任何ui元素的颜色。例如,Button小部件可以存在于几种不同状态之一(按下,聚焦或两者都没有),并使用颜色状态列表,你可以在每个州提供不同的颜色。
StateListDrawable是一个XML格式的可绘制对象,它使用几个不同的图像来表示相同的图形,具体取决于对象的状态。例如,Button小部件可以存在于几种不同状态之一(按下,聚焦或两者都没有),并且使用状态列表drawable,您可以为每个状态提供不同的背景图像。
虽然你做了什么但是它不是推荐的方法