androidではColorStart ListおよびStteListDrawableにSelectorを設定します。
13248 ワード
Androidのコードを書いたことがありますが、Selectorについてはよく知らないと思います。このXmlファイルはどのように定義されていますか?
また、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に書かれている以外に、コードの中でColorStarteListとStteListDrawableを通してSelectorを設置してもいいです。ColorStart StateListは主に色の状態に使われます。StteList Drawableは主に写真を設定するための状態です。もちろん、このコードを使って作成する方法は、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
Normal:0xffffffff
Pressed:0xffffff00
Focused:0xff0000ff
Unable: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.atr.state(u)presed、android.R.atr.state_enabled対応はいずれもxmlの値がtrueであり、つまりandroid:state_presed=「true」はこの値に似ています。ここでfalseに設定したいなら、前の方に「-」の負の符号を付けてもいいです。これは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