天天看點

如何動态生成Selector狀态選擇器

前幾天在項目有優化的時候,突然想動态生成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;
    }
}