使用glide和volley创建自己的网络图库

来源:互联网 发布:linux分区方案 知乎 编辑:程序博客网 时间:2024/04/30 11:18

1.利用NetworkImage加载网络图片

首先是添加依赖
compile 'com.mcxiaoke.volley:library:1.0.19'// volley依赖compile 'com.github.bumptech.glide:glide:3.5.2'// glide依赖

用retrofit取数据的部分请参照上一篇

        callGet.enqueue(new Callback<MeiNvBean>() {            @Override            public void onResponse(Call<MeiNvBean> call, retrofit2.Response<MeiNvBean> response) {                for(MeiNvBean.NewsList bean : response.body().getNewslist()){                    bitmaps.add(bean.getPicUrl());                }                initView();            }            @Override            public void onFailure(Call<MeiNvBean> call, Throwable t) {            }        });
以上代码用来获取网络图片的url把它们放到一个list里

然后初始化recycleView setLayoutManager这部分将 recycle设置成 2行的瀑布流gridView

    private void initView() {        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,                StaggeredGridLayoutManager.VERTICAL));        ImageAdapter adapter = new ImageAdapter(this, bitmaps,0);        recyclerView.setAdapter(adapter);    }


ImageAdapter是这样写的

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.MyViewHolder> {    private List<String> mDatas;    private Context mContext;    private LayoutInflater inflater;    private int type =  -1;    public ImageAdapter(Context context, List<String> datas, int type){        this.mContext=context;        this.mDatas=datas;        this.type=type;        inflater=LayoutInflater.from(mContext);    }    @Override    public int getItemCount() {        return mDatas.size();    }    //填充onCreateViewHolder方法返回的holder中的控件    @Override    public void onBindViewHolder(final MyViewHolder holder, final int position) {        BitmapUtil.autofit(mContext,holder.image);        switch (type){            case 0:                BitmapUtil.getBitmapInNetworkImageView(mContext,mDatas.get(position),holder.image);                break;            case 1://                BitmapUtil.getBitmapInGlide(mContext,mDatas.get(position),holder.image);                break;        }    }    //重写onCreateViewHolder方法,返回一个自定义的ViewHolder    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//        View view = inflater.inflate(R.layout.image_item ,parent, false);        View view = inflater.inflate(R.layout.image_loader_item,parent, false);        MyViewHolder holder= new MyViewHolder(view);        return holder;    }    class MyViewHolder extends ViewHolder{        NetworkImageView image;        public MyViewHolder(View view) {            super(view);            image=(NetworkImageView) view.findViewById(R.id.nivTestView);        }    }} 

重点是在bindView中调用autofit和getBitmapInNetworkImageView

autofit负责将image的大小适应屏幕的二分之一

    public static void autofit(Context context,View image){        DisplayMetrics dm = context.getResources().getDisplayMetrics();//取得屏幕宽度        int displayWidth = dm.widthPixels;        int displayHeight = dm.heightPixels;        ViewGroup.LayoutParams ps = image.getLayoutParams();将imageView的大小设置成        ps.width = (int)(displayWidth)/2;        image.setLayoutParams(ps);    }


getBitmapInNetworkImageView负责加载Url中的图片

    public static void getBitmapInNetworkImageView(Context mContext, String url,final NetworkImageView image) {        RequestQueue mQueue =  Volley.newRequestQueue(mContext);        ImageLoader imageLoader = new ImageLoader(mQueue,new BaseCache());        image.setDefaultImageResId(R.drawable.ic_beenhere_black_48dp);        image.setErrorImageResId(R.drawable.ic_satellite_black_48dp);        image.setImageUrl(url, imageLoader);    }
setDefaultImageResId设置未加载完成时的默认图片;

setErrorImageResId设置加载失败后的图片;

不过不得不提的是这个属性跟瀑布流有冲突,会造成一部分空白。

这里的url就是我们最初取得的picUrl

BaseCache()为设置缓存的类,没有特殊需求的话写法都是这样的

public class BaseCache implements ImageLoader.ImageCache {    private LruCache<String, Bitmap> mCache;    public BaseCache() {        int maxSize = 10 * 1024 * 1024;        mCache = new LruCache<String, Bitmap>(maxSize) {            @Override            protected int sizeOf(String key, Bitmap bitmap) {                return bitmap.getRowBytes() * bitmap.getHeight();            }        };    }    @Override    public Bitmap getBitmap(String url) {        return mCache.get(url);    }    @Override    public void putBitmap(String url, Bitmap bitmap) {        mCache.put(url, bitmap);    }}
当然你也可以用单例模式写,多次加载的情况下用单例写还是很省内存的

item的xml是这样写的

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:paddingLeft="5dp"    android:paddingRight="5dp">    <com.android.volley.toolbox.NetworkImageView        android:id="@+id/nivTestView"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:adjustViewBounds="true"        android:layout_marginRight="5dp">    </com.android.volley.toolbox.NetworkImageView></LinearLayout>

android:adjustViewBounds这个属性用来让图片等比例扩大或缩小,这也是为什么我在autofit只设置宽的原因,不然的话需要自己设置比例,然后注意一下NetworkImageView这个控件,如果你要使用NetworkImage的话 一定要使用这个控件不能使用普通的imageView;说实话,其实imageLoader的用法跟NetworkImage非常类似,有兴趣的朋友可以自己看一下。

2.利用Glide加载网络图片

首先当然是吧item里的NetworkImage换成imageView了,其他流程都一样,然后再加载图片时调用getBitmapInGlide方法,没错就是adapter case 1里的方法

这个方法是这样的

    public static void getBitmapInGlide(Context mContext, String url,final ImageView image) {        Glide.with(mContext)                .load(url)                .fitCenter()                .into(image);    }
。。。是不是非常简单,其实观看api我们就会知道Glide还可以加载gif,也可以load file,内部缓存优化做的也非常好,总之功能十分丰富再加上是谷歌的亲儿子,所以我还是很鼓励大家用这个三方库的,over

之后的我看情况会写openGL或者是一些常用算法的代码实现,嗯。。到今天才一个面试,感觉北漂的生活不太好。。。有点悲观,慢慢更博客吧,争取早日脱离审核

然后这部分的完整代码我稍后整理完会传到我的github 上就是这样!!

0 0