使用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); }
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
- 使用glide和volley创建自己的网络图库
- Protel DXP创建自己的原理图库
- 搭建自己的volley网络请求框架
- 网络请求开源库volley和AsyncHttp的使用
- Volley的使用(一) get请求和获取网络图片
- 访问网络的框架(Volley和OkHttp3)使用
- Docker使用网络命令,创建自己的网络
- Glide的学习和使用
- Android网络加载框架Glide的使用
- 网络请求库(ion、volley、retrofit)和图片加载库(glide、picasso、fresco)
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- Android中接口的回调,Activity或Fragment与普通类之间的互相调用
- PHP codeigniter框架
- Java线程总结(六):并发包------线程同步Lock
- 平衡三进制(可推广到n进制)
- 22. Generate Parentheses
- 使用glide和volley创建自己的网络图库
- jdbc底层封装
- 包含cv::Mat和cv::Rect的人眼ROI结构体在内存中的分布
- [LeetCode]3Sum
- nodejs搭建一个简单的httpserver
- 插播-管理书目
- CSS3的calc()使用
- 运算符重载
- Hadoop集群搭建