运行时改变android控件颜色

许多应用都需要根据用户的操作来改变图形颜色,文字颜色。
最多的应用场景包括,当用户将焦点移动到某一个模块时,高亮那个模块。
当用户点击某一个按钮时,改变按钮上文字的颜色和按钮的背景色。

1:根据用户操作改变按钮的背景色(图)
先以改变按钮的背景色为例子。
首先,你应该有按钮的这几种对应效果图。我这有三种
聚焦:btn_focus.9.png  按压:btn_press.9.png  默认:btn.9.png
这三张图都放到drawable中。然后在drawable中创建一个任意名的xml文件比如
res/drawable/blue_orange_btn.xml

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"    ---------按压时
        android:drawable="@drawable/btn_press" />
    <item android:state_focused="true"    ---------聚焦时
        android:drawable="@drawable/btn_focus" />
    <item                                 ---------默认时
        android:drawable="@drawable/btn" />
</selector>
这个排序是有讲究的,因为android在匹配效果的时候是从上往下的,一旦有匹配的就不会再往下匹配了。所以在控制类似checkbox的图形属性时,除了可以用多个android:state来进行精确的控制外,还要注意排序。
android:state_checked="true" android:state_focused="true"详细的checkbox设置我之前的blog写过 就不赘述了。
按照经验和惯例,一般是呈现给用户时间越长的越排在这个xml的底部。
在这个button的layout文件中如下设置
<Button
android:id="@+id/begin_btn"
android:layout_width="258dp"
style="@style/text_18sp_fff.22sp"
android:text="@string/begin_btn"
android:layout_centerHorizontal="true"

android:layout_below="@id/diban"
android:layout_marginTop="16dp"
android:background="@drawable/blue_orange_btn"/>


1.2:动态的改变用户操作背景色组合
根据不同的需求 你还可以在代码中灵活的控制不同的色彩组合。
比如你有两套颜色变化:
res/drawable/blue_orange_btn.xml
res/drawable/blue_white_btn.xml
你可以在代码中按照你的需求动态设置。
if(begin){
begin_btn.setBackgroundResource(R.drawable.blue_orange_btn);
}else{
begin_btn.setBackgroundResource(R.drawable.blue_white_btn);
}
如果用的不是button 而是用imageView 你可以用setImageResource(int)方法,具体的看文档吧。

2: 根据用户操作改变文字的颜色。
改变文字颜色的操作方法跟改变按钮或ImageView的理论是一样的。
创建res/color/text_white_blue.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="@android:color/white" />
    <item android:state_focused="true"
        android:color="@android:color/white" />
    <item 
        android:color="@android:color/blue" />
</selector>

layout中TextView如下
<TextView
    android:id="@+id/call_log"
    style="@style/style1"
android:duplicateParentState="true"
    android:text="@string/call_log"
       android:textColor="@color/text_white_blue"
   />
中间有一个duplicateParentState属性。主要作用是当这个TextView是属于某一个控件的时候,比如属于一个layout。他会保持跟父控件的用户操作状态一致。
也就是说当这个TextView所属于的layout被用户所按压的时候,这个TextView会同时被至于按压的状态。
这个属性能够极大的简化程序员的工作量,可以让一个主控件和其子控件保持步调一致改变,统一风格。

2.2:在代码中动态的设置用户操作的文字色组合。
本来以为会跟button 和 ImageView一样非常简单就是对应的set方法加上资源文件。
但是其实不是的,字体的颜色如果用setTextColor(R.color.text_blue_white)来设置,会悲剧。
原因我也不是很明白,反正几乎是改变不了。
代码中正确的设置方式应该是
if(begin)
setTextColor(getResources().getColor(R.color.text_white_blue));
else
     setTextColor(getResources().getColor(R.color.text_white_red));

 
By the way:
有时候需要将整个textview中的部分文字改变颜色
简单的办法如下
TextView.append(Html.fromHtml("<font color=\"#0088bb\">"+str+"</font>"));
当然也有更复杂和更强大的方法,就是通过SpannableString
简单举例如下
        SpannableString ss = new SpannableString("AAAA.");
         //改变0-2号字符的颜色
        ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值