在Android里面拂铡,實現(xiàn)TextView
等根據(jù)不同狀態(tài)顯示不同的背景和顏色是很簡單滴壹无,只需要設置對應的selector就好了!
背景選擇器(res/drawable):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:drawable/ic_delete" android:state_checked="true"/>
<item android:drawable="@android:drawable/ic_input_add"/>
</selector>
顏色選擇器(res/color):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:color="#ff0000" />
<item android:state_focused="true" android:color="#ff0000" />
<item android:state_pressed="true" android:color="#ff0000" />
<item android:color="#89683B" />
</selector>
那么我們需要動態(tài)設置這些東西怎么寫呢和媳?這里就有兩個類了:StateListDrawable,ColorStateList看這個名字就知道這兩個類是來干嘛的了格遭!
首先說下StateListDrawable
創(chuàng)建對應的StateListDrawable
,通過addState (int[] stateSet, Drawable drawable)
的方法添加我們指定的一些狀態(tài)哈街,可以看到第一個參數(shù)是一個數(shù)組留瞳,后面就是對應的Drawable
。那么問題來了骚秦,一個狀態(tài)的true或者false是怎么指定的呢她倘?答案就是下面這個樣子滴:
StateListDrawable states = new StateListDrawable();
states.addState(new int[]{-android.R.attr.state_checked}, getDrawable(android.R.drawable.ic_media_play));
states.addState(new int[]{android.R.attr.state_checked}, getDrawable(android.R.drawable.ic_delete));
return states;
前面有一個負號就是false的狀態(tài)!
然后就是ColorStateList
了作箍,它的構造方法public ColorStateList(int[][] states, @ColorInt int[] colors)
,看著是不是有點兒膩害硬梁,顏色狀態(tài)居然指定的是一個二維的數(shù)組,剛剛上面不是都才指定一個一維的數(shù)組嘛胞得,為什么這里就是一個二維的呢荧止?第二個參數(shù)也是一個color的數(shù)組。
其實可以這樣理解阶剑,就是把上面說的一個狀態(tài)和一個color又分別裝到了一個數(shù)組中了跃巡,所以維度都對應增加了1,這樣我們就不用去添加好幾次了牧愁,注意上面的寫法素邪,每一種狀態(tài)我們都需要添加一次的!猪半!
那么套路明確了之后就可以把上面的寫法改造一下兔朦,比如說第一個參數(shù)一個二維數(shù)組:
int[][] states = new int[][]{
new int[]{-android.R.attr.state_checked}, // unchecked
new int[]{android.R.attr.state_checked} // checked
};//把兩種狀態(tài)一次性添加
第二個參數(shù)每個狀態(tài)對應的顏色:
int[] colors = new int[]{
Color.RED,
Color.GREEN
};//把兩種顏色一次性添加
最后再調用構造方法就好啦!磨确!
ColorStateList colorStateList = new ColorStateList(states, colors);
最后沽甥,再說說給TextView
及它的小弟動態(tài)設置CompoundDrawable
的問題,這個就是在xml中設置的那個drawableTop
乏奥、drawableBottom
安接、等等!
這里需要注意一個問題,就是我們代碼new出來的Drawable的Bound是沒有指定好的盏檐,那么導致的問題就是它可能根本就不會繪制的P健!
解決辦法就是你可以直接調用setCompoundDrawablesRelativeWithIntrinsicBounds()
這個老長老長的方法讓系統(tǒng)自動去設置那個Bound的參數(shù)胡野!
@android.view.RemotableViewMethod
public void setCompoundDrawablesRelativeWithIntrinsicBounds(@Nullable Drawable start,
@Nullable Drawable top, @Nullable Drawable end, @Nullable Drawable bottom) {
if (start != null) {
start.setBounds(0, 0, start.getIntrinsicWidth(), start.getIntrinsicHeight());
}
if (end != null) {
end.setBounds(0, 0, end.getIntrinsicWidth(), end.getIntrinsicHeight());
}
if (top != null) {
top.setBounds(0, 0, top.getIntrinsicWidth(), top.getIntrinsicHeight());
}
if (bottom != null) {
bottom.setBounds(0, 0, bottom.getIntrinsicWidth(), bottom.getIntrinsicHeight());
}
setCompoundDrawablesRelative(start, top, end, bottom);
}
當然你也可以老老實實在創(chuàng)建StateListDrawable
的時候手動調用一下setBound()
的方法啦2氖А!
到此結束A蚨埂龙巨!希望大家不要再掉到對應的坑里面了!熊响!
---- Edit By Joe ----