android中ColorStateList及StateListDrawable设置Selector

写过android的代码相信大家对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:state_window_focused="true" android:drawable= "@drawable/pic1" />
      <!--  触摸时并且没有获得焦点状态 -->
      <item android:state_pressed="true" android:state_focused="false" android:drawable="@drawable/pic2" />
      <!--选中时的图片背景-->
      <item android:state_selected="true" android:drawable="@drawable/pic3" />
      <!--获得焦点时的图片背景-->
      <item android:state_focused="true" android:drawable="@drawable/pic4" />
      <!-- 窗口没有处于交互时的背景图片 -->
      <item android:drawable="@drawable/pic5" />
    </selector>  

上面的代码估计很多人都会经常的使用到,除了在xml里面写之外,我们还可以在代码中通过ColorStateList和StateListDrawable来设置Selector,ColorStateList主要是用于颜色的状态,StateListDrawable这个主要是用于设置图片的状态,当然使用这种代码编写的方法我们可以动态设置TextView、Button、ImageView等组件在不同状态下的背景/前景显示效果。而不需要固定死。

package lab.sodino.statelist;

import android.app.Activity;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

/**
 * 对TextView设置ColorStateList使其在Normal、Pressed、Focused、Unable四种状态下显示不同的颜色。<br/>
 * StateListDrawable可直接使用图片应用在相似场合。
 */
public class ActColorStateList extends Activity implements OnClickListener {
    private TextView txtShow;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txtShow = (TextView) findViewById(R.id.txtShow);
        txtShow.setText("Sodino\nNormal:0xffffffff\nPressed:0xffffff00\nFocused:0xff0000ff\nUnable:0xffff0000");
        txtShow.setTextColor(createColorStateList(0xffffffff, 0xffffff00, 0xff0000ff, 0xffff0000));
        txtShow.setOnClickListener(this);
    }

    /** 对TextView设置不同状态时其文字颜色。 */
    private ColorStateList createColorStateList(int normal, int pressed, int focused, int unable) {
        int[] colors = new int[] { pressed, focused, normal, focused, unable, normal };
        int[][] states = new int[6][];
        states[0] = new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled };
        states[1] = new int[] { android.R.attr.state_enabled, android.R.attr.state_focused };
        states[2] = new int[] { android.R.attr.state_enabled };
        states[3] = new int[] { android.R.attr.state_focused };
        states[4] = new int[] { android.R.attr.state_window_focused };
        states[5] = new int[] {};
        ColorStateList colorList = new ColorStateList(states, colors);
        return colorList;
    }

    /** 设置Selector。 */
    public static StateListDrawable newSelector(Context context, int idNormal, int idPressed, int idFocused,
            int idUnable) {
        StateListDrawable bg = new StateListDrawable();
        Drawable normal = idNormal == -1 ? null : context.getResources().getDrawable(idNormal);
        Drawable pressed = idPressed == -1 ? null : context.getResources().getDrawable(idPressed);
        Drawable focused = idFocused == -1 ? null : context.getResources().getDrawable(idFocused);
        Drawable unable = idUnable == -1 ? null : context.getResources().getDrawable(idUnable);
        // View.PRESSED_ENABLED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled }, pressed);
        // View.ENABLED_FOCUSED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_enabled, android.R.attr.state_focused }, focused);
        // View.ENABLED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_enabled }, normal);
        // View.FOCUSED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_focused }, focused);
        // View.WINDOW_FOCUSED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_window_focused }, unable);
        // View.EMPTY_STATE_SET
        bg.addState(new int[] {}, normal);
        return bg;
    }

    @Override
    public void onClick(View v) {
        if (v == txtShow) {
            txtShow.setEnabled(false);
        }
    }
}

我们看到在上面中出现 states[5] = new int[] {};和bg.addState(new int[] {}, normal);这些就是表示在不是上面任何一种状态的时候默认的值,像上面的这种状态android.R.attr.state_pressed,android.R.attr.state_enabled对应都是在xml中的值都是为true,即android:state_pressed="true"类似这个值,那么如果我这里想要设置为false时可以在前面加上一个 “-”负数的符号,比如bg.addState(new int[] {-android.R.attr.state_focused }, focused);那么这个就是表示state_focused=false时的值为focused。

还有我们可以读取xml中设定的颜色值:比如

 ColorStateList mIdleColorState = getResources().getColorStateList(idleStateSelector);

 int colorNormal=colorStateList.getColorForState(new int[]{android.R.attr.state_enabled}, 0);

 int colorDisabled=colorStateList.getColorForState(new int[]{-android.R.attr.state_enabled}, 0);//“-”负号表示对应的属性值为false
时间: 2024-11-20 04:37:27

android中ColorStateList及StateListDrawable设置Selector的相关文章

如何在Android中为TextView动态设置drawableLeft等

如何在Android中为TextView动态设置drawableLeft等 两种方式: 方式1:手动设置固有边界 1 Drawable drawable = getResources().getDrawable(resId); 2 //注意查看方法TextView.setCompoundDrawables(Drawable, Drawable, Drawable, Drawable) 3 //的注释,要求设置的drawable必须已经通过Drawable.setBounds方法设置过边界参数 4

Android中通过反射来设置显示时间

这个Toast的显示在Android中的用途还是很大的,同时我们也知道toast显示的时间是不可控的,我们只能修改他的显示样式和显示的位置,虽然他提供了一个显示时间的设置方法,但是那是没有效果的(后面会说到),他有两个静态的常量Toast.SHORT和Toast.LONG,这个在后面我会在源码中看到这个两个时间其实是2.5s和3s.那么我们如果真想控制toast的显示时间该怎么办呢?真的是无计可施了吗?天无绝人之路,而且Linux之父曾经说过:遇到问题就去看那个操蛋的源代码吧!!下面就从源代码开

【原创】如何在Android中为TextView动态设置drawableLeft等

如何在Android中为TextView动态设置drawableLeft等 两种方式: 方式1:手动设置固有边界 1 Drawable drawable = getResources().getDrawable(resId); 2 //注意查看方法TextView.setCompoundDrawables(Drawable, Drawable, Drawable, Drawable) 3 //的注释,要求设置的drawable必须已经通过Drawable.setBounds方法设置过边界参数 4

Android中通过反射来设置Toast的显示时间

这个Toast的显示在Android中的用途还是非常大的,同一时候我们也知道toast显示的时间是不可控的.我们仅仅能改动他的显示样式和显示的位置,尽管他提供了一个显示时间的设置方法.可是那是没有效果的(后面会说到).他有两个静态的常量Toast.SHORT和Toast.LONG,这个在后面我会在源码中看到这个两个时间事实上是2.5s和3s. 那么我们假设真想控制toast的显示时间该怎么办呢?真的是无计可施了吗?天无绝人之路,并且Linux之父以前说过:遇到问题就去看那个操蛋的源码吧.!以下就

Android中字体颜色的设置

1.在Android中经常看到设置的颜色为八位的十六进制的颜色值,例如: 1 2 3 public static final class color {     public static final int lightblue=0x7f040000; } 或者在Java中tx.setTextColor(0xffff00f); 说明: 0xffff00ff是int类型的数据,分组一下0x|ff|ff00ff,0x表示颜色整数的标记,ff表示透明度,f00f表示色值,注意:0x后面ffff00ff

关于那些Android中不常用的设置属性

很多在manifest中的属性我们经常遗忘了它们,或者经常看到但又不是很明白它的作用.那么在这里我就拿了一些属性简单的解释一下,防止以后碰到却不知道其中的意思.不是很全,以后会断断续续的补充吧 一.android:installLocation="internalOnly"android:installLocation隶属于AndroidManifest.XML中的manifest节点.如下所示: <manifest xmlns:android="http://sche

android中对Bitmap图片设置任意角为圆角

http://blog.csdn.net/l448288137/article/details/48276681 最近项目开发中使用到了圆角图片,网上找到的圆角图片控件大多比较死板,只可以全圆角.其中感觉最好的也就是半圆角 链接在这里.想了一下,我自己在这个的基础上进行了一点改进,使得图片可以设置任意角为圆角. 先上效果图: 核心代码 [java] view plain copy package fillet.sgn.com.filletimage; import android.graphic

android中如何正确的设置view的多个tag值

在android开发过程中,我们经常会用到view.setTag(object)这个方法,特别是在ListView的自定义的adapter中复用view的时候.同时,view还提供了设置多个tag数据的方法,即view.setTag(int,Object),其中这个int值需要设置正确,不然这个方法会报错了.让我们来看看怎么设置这个值.先看结果: 从eclipse打印的log可以看出,我设置了gridview的4种不同类型的tag值.再来看看代码. package com.androidtest

android 中 actionbar 常用方法。设置标题,隐藏图标等

设置标题: actionBar.setTitle("关于我们"); 使返回箭头出现 actionBar.setDisplayHomeAsUpEnabled(true); 监听返回按钮的 事件 public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } return super.onOptionsIte