Android使用代码动态创建Selector(网络图片)
发布日期:2021-07-19 12:29:41 浏览次数:9 分类:技术文章

本文共 4287 字,大约阅读时间需要 14 分钟。

有时候我们需要从网络下载图片,并动态替换本地的图片,典型的场景就是替换tab上的图片。

这里使用Glide加载图片,允许第一次加载慢,往后就采用缓存加载,无延迟,代码如下 

有一点需要大家注意的地方,那就是在drawable.addState添加状态的时候,要注意先添加选中状态的图片,其次才是未选中的状态,和shape添加选择器一样的。

 

延伸:提供一个动态生成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
(){ @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
(){ @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; }}

 

转载地址:https://blog.csdn.net/jdsjlzx/article/details/90449546 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android游戏中添加音频-详解MediaPlayer与SoundPoo!并讲解两者的区别和游戏中的用途!
下一篇:Dialog常见问题

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2023年09月04日 13时00分30秒