前幾天在項目有優化的時候,突然想動态生成selector 是以就寫了一個工具類
/**
* 動态設定 點選事件 selector 的工具類 可以從本地添加 也可以從網絡添加
* Created by suwenlai on 16-12-26.
*/
public class SelectorUtil {
/**
* 從 drawable 擷取圖檔 id 給 Imageview 添加 selector
* @param context 調用方法的 Activity
* @param idNormal 預設圖檔的 id
* @param idPress 點選圖檔的 id
* @param iv 點選的 view
*/
public static void addSelectorFromDrawable(Context context , int idNormal, int idPress,ImageView iv){
StateListDrawable drawable = new StateListDrawable();
Drawable normal = context.getResources().getDrawable(idNormal);
Drawable press = context.getResources().getDrawable(idPress);
drawable.addState(new int[]{android.R.attr.state_pressed},press);
drawable.addState(new int[]{-android.R.attr.state_pressed},normal);
iv.setBackgroundDrawable(drawable);
}
/**
* 從 drawable 擷取圖檔 id 給 Button 添加 selector
* @param context 調用方法的 Activity
* @param idNormal 預設圖檔的 id
* @param idPress 點選圖檔的 id
* @param button 點選的 view
*/
public static void addSelectorFromDrawable(Context context , int idNormal, int idPress,Button button){
StateListDrawable drawable = new StateListDrawable();
Drawable normal = context.getResources().getDrawable(idNormal);
Drawable press = context.getResources().getDrawable(idPress);
drawable.addState(new int[]{android.R.attr.state_pressed},press);
drawable.addState(new int[]{-android.R.attr.state_pressed},normal);
button.setBackgroundDrawable(drawable);
}
/**
* 從網絡擷取圖檔 給 ImageView 設定 selector
* @param clazz 調用方法的類
* @param normalUrl 擷取預設圖檔的連結
* @param pressUrl 擷取點選圖檔的連結
* @param imageView 點選的 view
*/
public static void addSeletorFromNet(final Class clazz, final String normalUrl, final String pressUrl, final ImageView imageView){
new AsyncTask<Void,Void,Drawable>(){
@Override
protected Drawable doInBackground(Void... params) {
StateListDrawable drawable = new StateListDrawable();
Drawable normal = loadImageFromNet(clazz,normalUrl);
Drawable press = loadImageFromNet(clazz, pressUrl);
drawable.addState(new int[]{android.R.attr.state_pressed},press);
drawable.addState(new int[]{-android.R.attr.state_pressed},normal);
return drawable;
}
@Override
protected void onPostExecute(Drawable drawable) {
super.onPostExecute(drawable);
imageView.setBackgroundDrawable(drawable);
}
}.execute();
}
/**
*
* 從網絡擷取圖檔 給 Button 設定 selector
* @param clazz 調用方法的類
* @param normalUrl 擷取預設圖檔的連結
* @param pressUrl 擷取點選圖檔的連結
* @param button 點選的 view
*/
public static void addSeletorFromNet(final Class clazz, final String normalUrl, final String pressUrl, final Button button){
new AsyncTask<Void,Void,Drawable>(){
@Override
protected Drawable doInBackground(Void... params) {
StateListDrawable drawable = new StateListDrawable();
Drawable normal = loadImageFromNet(clazz,normalUrl);
Drawable press = loadImageFromNet(clazz, pressUrl);
drawable.addState(new int[]{android.R.attr.state_pressed},press);
drawable.addState(new int[]{-android.R.attr.state_pressed},normal);
return drawable;
}
@Override
protected void onPostExecute(Drawable drawable) {
super.onPostExecute(drawable);
button.setBackgroundDrawable(drawable);
}
}.execute();
}
/**
* 從網絡擷取圖檔
* @param clazz 調用方法的類
* @param netUrl 擷取圖檔的連結
* @return 傳回一個 drawable 類型的圖檔
*/
private static Drawable loadImageFromNet(Class clazz, String netUrl) {
Drawable drawable =null;
try {
drawable = Drawable.createFromStream(new URL(netUrl).openStream(), "netUrl.jpg");
} catch (IOException e) {
MyLog.e(clazz.getName(),e.getMessage());
}
return drawable;
}
}