您的位置:首页 > 理论基础 > 计算机网络

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

2016-09-13 16:20 337 查看
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>() {@Overridepublic void onResponse(Call<MeiNvBean> call, retrofit2.Response<MeiNvBean> response) {for(MeiNvBean.NewsList bean : response.body().getNewslist()){bitmaps.add(bean.getPicUrl());}initView();}@Overridepublic 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);}@Overridepublic int getItemCount() {return mDatas.size();}//填充onCreateViewHolder方法返回的holder中的控件@Overridepublic 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@Overridepublic 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和getBitmapInNetworkImageViewautofit负责将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就是我们最初取得的picUrlBaseCache()为设置缓存的类,没有特殊需求的话写法都是这样的
public class BaseCache implements ImageLoader.ImageCache {private LruCache<String, Bitmap> mCache;public BaseCache() {int maxSize = 10 * 1024 * 1024;mCache = new LruCache<String, Bitmap>(maxSize) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return bitmap.getRowBytes() * bitmap.getHeight();}};}@Overridepublic Bitmap getBitmap(String url) {return mCache.get(url);}@Overridepublic 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.NetworkImageViewandroid: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 上就是这样!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: