android 程式碼編寫selector--StateListDrawable使用
在專案開發中肯定會遇到各種點選效果,一般都是建立一個xml檔案然後放在drawable資料夾下面,最後控制元件設定background引用。如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/back_press" android:state_pressed="true"/>
<item android:drawable="@drawable/back_press" android:state_focused ="true"/>
<item android:drawable="@drawable/back"/>
</selector>
這是一個給Button使用的點選效果背景選擇,這種不同狀態顯示不同背景的xml檔案我們稱為selector。其實selector的本質是一個drawable物件。
這樣一兩個效果還好,但是當專案裡面的點選效果特別多的時候如果再一個個去寫的話無疑是很費精力。這種情況下我們就可以使用StateListDrawable用程式碼來寫。接下來我們從本地和網路圖片兩種來介紹。
一、本地:
public class DrawableUtil {
public static StateListDrawable addStateListBgDrawable(Context context,
int idNormal, int idPressed) {
StateListDrawable drawable = new StateListDrawable();
drawable.addState(new int[] { android.R.attr.state_selected }, context
.getResources().getDrawable(idPressed));
drawable.addState(new int[] { android.R.attr.state_pressed }, context
.getResources().getDrawable(idPressed));
drawable.addState(new int[] { android.R.attr.state_enabled }, context
.getResources().getDrawable(idNormal));
drawable.addState(new int[] {},
context.getResources().getDrawable(idNormal));
return drawable;
}
}
這裡要注意新增的順序,只要有一個狀態與之相配,背景就會被換掉。所以不要把大範圍放在前面了,例如如果drawable.addState(new int[] {},context.getResources().getDrawable(idNormal));
放在第一個的話,就沒有什麼效果了。
這裡還有其他的效果就不一一列舉了,
最後在程式碼中給控制元件新增:button.setBackground(DrawableUtil.addStateListDrawable(context,
傳入一張正常顯示圖片和一張點選下的圖片就好了。
R.drawable.pic1, R.drawable.pic2));
二、接下來是擴充套件網路圖片:
/**
* 顯示網路圖片
*
* @param context
* @param idNormalUrl 正常圖片
* @param idPressedUrl 按下選中圖片
* @param resId 圖片載入失敗的預設selector
* @return
*/
@SuppressLint("NewApi")
public static void SetnetSelector(final Context context,
final ImageView mImage, final String idNormalUrl,
final String idPressedUrl, final int resId) {
final StateListDrawable drawable = new StateListDrawable();
// 顯示圖片的配置
final DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true).cacheOnDisk(true)
.bitmapConfig(Bitmap.Config.ARGB_8888).build();
ImageLoader.getInstance().loadImage(idPressedUrl, options,
new SimpleImageLoadingListener() {
@SuppressWarnings("deprecation")
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
// TODO Auto-generated method stub
Drawable draw = new BitmapDrawable(loadedImage);
drawable.addState(
new int[] { android.R.attr.state_selected },
draw);
drawable.addState(
new int[] { android.R.attr.state_pressed },
draw);
ImageLoader.getInstance().loadImage(idNormalUrl,
options, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(
String imageUri, View view,
Bitmap loadedImage) {
// TODO Auto-generated method stub
Drawable draw = new BitmapDrawable(
loadedImage);
drawable.addState(
new int[] { android.R.attr.state_enabled },
draw);
drawable.addState(new int[] {}, draw);
mImage.setBackground(drawable);
super.onLoadingComplete(imageUri, view,
loadedImage);
}
@Override
public void onLoadingFailed(
String imageUri, View view,
FailReason failReason) {
// TODO Auto-generated method stub
mImage.setBackgroundResource(resId);
super.onLoadingFailed(imageUri, view,
failReason);
}
});
super.onLoadingComplete(imageUri, view, loadedImage);
}
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
// TODO Auto-generated method stub
mImage.setBackgroundResource(resId);
super.onLoadingFailed(imageUri, view, failReason);
}
});
}
這裡說一下最後的resId引數,這裡就是文章開頭說的在xml中寫的selector,防止圖片載入失敗後沒有點選圖片顯示的情況。使用方法和本地一樣`button.setBackground(DrawableUtil.addStateListDrawable(context,
`,就是多傳一個失敗情況下的selector。
R.drawable.pic1, R.drawable.pic2,R.drawable.localXml));