#一、轮播图控件及图片加载

对于Android端的轮播图控件,我这边选用的是banner库
//轮播图
compile 'com.youth.banner:banner:1.4.9'
//Glide
compile 'com.github.bumptech.glide:glide:3.8.0'

#二、banner初始化
1.引入banner布局

    <com.youth.banner.Bannerandroid:id="@+id/banner"android:layout_width="match_parent"android:layout_height="match_parent" />

2.初始化banner控件
我这边使用的是只有图片的轮播图,所以选用的banner样式是BnnerConfig.CIRCLE_INDICATOR,如果有需要标题的则需要将样式改成带标题的banner样式,并且需要设置标题集合,设置方式同设置图片集合。

/*** 初始化轮播图*/private void initBanner() {images = new ArrayList<>();banner = (Banner) findViewById(R.id.banner);//设置banner样式banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR);//设置图片加载器banner.setImageLoader(new ImageLoader() {@Overridepublic void displayImage(Context context, Object path, ImageView imageView) {//Glide 加载图片简单用法L.i((String) path);Glide.with(context).load((String) path).into(imageView);}});//设置图片集合banner.setImages(images);//设置banner动画效果banner.setBannerAnimation(Transformer.CubeOut);//设置自动轮播,默认为truebanner.isAutoPlay(true);//设置轮播时间banner.setDelayTime(3000);//设置指示器位置(当banner模式中有指示器时)banner.setIndicatorGravity(BannerConfig.CENTER);banner.setOnBannerListener(new OnBannerListener() {@Overridepublic void OnBannerClick(int position) {//点击轮播图}});//banner设置方法全部调用完毕时最后调用banner.start();}

#三、网络获取图片数据
1.直接获取网络图片并设置到到轮播图显示

    /*** 获取网络图片*/public void getImags() {Observable ob = Api.getDefault().getAdvImg();HttpUtil.getInstance().toSubscribe(ob,false, new ProgressSubscriber<AdvImags>(this) {@Overrideprotected void _onNext(AdvImags advImagses) {L.i("=======>有数据");images.clear();for (AdvImags.DataBean dataBean : advImagses.getData()) {//加入网络图片地址images.add(dataBean.getImgUrl());}banner.setImages(images);banner.start();}@Overrideprotected void _onError(String message) {T.showShort(SplashActivity.this, message);images.clear();images.add("file:///android_asset/icon_advs_img1.jpg");images.add("file:///android_asset/icon_advs_img2.jpg");images.add("file:///android_asset/icon_advs_img3.jpg");banner.setImages(images);banner.start();}}, "cacheKey", ActivityLifeCycleEvent.DESTROY, lifecycleSubject, false, false);}

在使用网络图片的时候就涉及到网络图片的缓存问题,在glide本身已经有的缓存机制下已经极大限度的优化了用户体验,但是在有特殊需求的情况下就需要自己去做图片的保存处理了。
比如我这边经常能遇到的,因为我是大部分处理智能设备的app开发,那么客户希望在用户在智能设备上面没有进行操作的时候,会自动跳转到轮播图广告的页面,然后用户在点击广告图之后又跳转回正常操作页面。在这样的逻辑里面,就涉及到了banner所在的类,是需要经常销毁并且重新onCreate的。这个时候直接加载网络图片会非常消耗流量。

2.将网络图片下载下来,然后保存在本地SD卡中,在需要轮播图显示的时候再加载出来显示

(1)获取图片地址,先删除本地原有的轮播图片

//轮播图推送
CommentUtils.getImagePathFromSD(true);
for (int i = 0; i < advs.length; i++) {//加入网络图片地址DownloadImageUtils.downloadLatestFeature(advs[i]);
}

(2)下载图片工具类及接口封装

/*** Created by Administrator on 2018/4/11.*/public class DownloadImageUtils {private static String APP_IMAGE_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator+ "miniGPS";/*** 下载图片到SD卡** @param url*/public static void downloadLatestFeature(final String url) {Call<ResponseBody> resultCall = DownloadImageUtils.downloadLatestFeatureCall(url);resultCall.enqueue(new Callback<ResponseBody>() {@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {writeResponseBodyToDisk(response.body());}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {}});}/*** 下载最新模板图片*/public static Call<ResponseBody> downloadLatestFeatureCall(String imageUrl) {return Api.getDefault().downloadLatestFeature(imageUrl);}/*** 保存下载的图片流写入SD卡文件** @param body image stream*/public static void writeResponseBodyToDisk(ResponseBody body) {if (body == null) {T.showShort(MyApplication.getContext(), "图片源错误");return;}Log.e("TAG", "下载图片==========》");String APP_IMAGE_NAME = System.currentTimeMillis() + ".png";try {InputStream is = body.byteStream();File fileDr = new File(APP_IMAGE_DIR);if (!fileDr.exists()) {fileDr.mkdir();}File file = new File(APP_IMAGE_DIR, APP_IMAGE_NAME);if (file.exists()) {file.delete();file = new File(APP_IMAGE_DIR, APP_IMAGE_NAME);}FileOutputStream fos = new FileOutputStream(file);BufferedInputStream bis = new BufferedInputStream(is);byte[] buffer = new byte[1024];int len;while ((len = bis.read(buffer)) != -1) {fos.write(buffer, 0, len);}fos.flush();fos.close();bis.close();is.close();} catch (IOException e) {e.printStackTrace();}}
}

(3)添加接口

    /*** 下载图片** @return*/@Streaming@GETCall<ResponseBody> downloadLatestFeature(@retrofit2.http.Url String fileUrl);

(4)加载本地图片,并设置到轮播图显示

        //设置图片集合images.clear();images.addAll(CommentUtils.getImagePathFromSD(false));banner.setImages(images);banner.start();

以上就是如何去获取网络图片,并且下载到本地,在需要加载的时候加载出来显示到轮播图。当然如果本身不存在这种特殊的情况,可以依赖glide的本身的缓存机制来进行图片缓存。

【Android】轮播图图片的本地保存及读取相关推荐

  1. banner 获取当前指示物_Android轮播图图片的本地保存及读取

    一.轮播图控件及图片加载 对于Android端的轮播图控件,我这边选用的是banner库 //轮播图 compile 'com.youth.banner:banner:1.4.9' //Glide c ...

  2. android github轮播图,GitHub - ZTJzzz/Banner: Android轮播图

    Android轮播图 - Banner 纵观Android古今,轮播图已然泛滥成灾!大神们各显神通大兴土木,所起楼台之高让后来者心生膜拜,纷纷Star!但不法分子也是层出不穷,为求"大神&q ...

  3. 微信小程序轮播图单独添加图片、修改轮播图图片、单独修改某张图片

    小老弟上课的基本见解,有错误欢迎大牛们指正 <!--pages/swiper/swiper.wxml--> <text>pages/swiper/swiper.wxml< ...

  4. JS 轮播图 图片切换(定时器)

    标题JS 轮播图 图片切换(定时器) 这次的轮播图与上次的图片切换相比,仅仅是加上了定时器,使其可以自动切换. 上次的图片切换的链接:https://blog.csdn.net/qq_38318589 ...

  5. 微信小程序—swiper轮播图图片不显示的解决方法

    swiper轮播图图片不显示的解决方法 遇到图片无法显示的问题,是样式问题 在wxss里面新型修改 设置宽度 .container{width: 750rpx; } .container swiper ...

  6. Android的轮播图Banner之本地加载和网络加载图片(含demo)

    前言 关于轮播图 我个人是比较喜欢 闲来无事的时候 可以整理自己的照片 做一个demo 看看动态的效果 挺不错的! 每个App也基本都有一些广告位置 只要打开这个页面就会无限轮播广告图片 看多了我们也 ...

  7. android轮播图实现方案,Android轮播图实现教程

    ListView的headerView设置为轮播图之后结合上/下拉刷新/加载的模式成为现在大多数APP的一个必须具备的功能,对于许多初学者来说想要实现轮播图这样一个集线程睡眠.自动处理.替换过程中刷新 ...

  8. Android轮播图原理思路分析+实现方案

    来自:http://blog.csdn.net/wubihang/article/details/52512597 ListView的headerView设置为轮播图之后结合上/下拉刷新/加载的模式成 ...

  9. Android轮播图

    轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考 目前测试图片为mipmap中的图片 没有写从网络加载 ...

最新文章

  1. 【Python之旅】第五篇(一):Python Socket通信原理
  2. VueJS ReactJS 如何?听听别人怎么说。
  3. 浅谈JavaScript中的对象和类型(上)
  4. 万万没想到,刷1000道题目,还不如搞懂这几个机械动图!
  5. 面试官 | 说一下 JVM 常用参数有哪些?
  6. flux读取不到数据_初学flux的疑问?无法添加数据到DOM
  7. c语言编程师,单片机C语言编程师
  8. 服务器cpu天梯图_笔记本CPU排行天梯图2020
  9. 适合学生党和上班族的祛痘方法
  10. 即时通讯,2022即时通讯IM厂商介绍
  11. 办公室设计公司关于办公室装修全过程解剖
  12. html5 自动失去焦点,js input失去焦点事件
  13. 史上最全的ubuntu服务器搭建环境教程~~~
  14. 微信打开网址提示已停止访问该网页 怎么办?
  15. Python黑帽子 黑客与渗透测试编程之道(七) 第四章:Scapy:网络的掌控者
  16. mac系统安装手机安装包
  17. 微信小程序时间加法_微信小程序日期转换、比较、加减
  18. bmi系统模块设计java_BMI体脂计算器 app源码
  19. QTabWidget自定义,拖入拖出Tab页的简易实现
  20. 医咖会免费STATA教程学习笔记——二分类Logistic回归

热门文章

  1. HTML代码实例:详细讲解超级链接--网页制作
  2. 酷派发布高端智能手机,今年销售额冲击80亿
  3. 利用Wireshark抓取QQ的数据流
  4. plt设置坐标轴标签倾斜
  5. toshare获取所有A股数据(复权数据)
  6. c语言cls为什么没起作用,c语言的“clsquot;是什么意思
  7. 大服务器实装维护公告,官博:大服务器实装维护公告(4月16日)
  8. iSCSI 网络存储/文件共享 介绍 及 示例
  9. 计算机管理需要关闭所有会话框吗,关闭 XXXXX 前你必须关闭所有会话框
  10. 分析无线鼠标无反应的几点原因