美文网首页
Android轮播图图片的本地保存及读取

Android轮播图图片的本地保存及读取

作者: 张迅之乎者也 | 来源:发表于2018-04-11 13:49 被阅读0次

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

    对于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.Banner
            android: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() {
                @Override
                public 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);
            //设置自动轮播,默认为true
            banner.isAutoPlay(true);
            //设置轮播时间
            banner.setDelayTime(3000);
            //设置指示器位置(当banner模式中有指示器时)
            banner.setIndicatorGravity(BannerConfig.CENTER);
            banner.setOnBannerListener(new OnBannerListener() {
                @Override
                public 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) {
    
                @Override
                protected void _onNext(AdvImags advImagses) {
                    L.i("=======>有数据");
                    images.clear();
                    for (AdvImags.DataBean dataBean : advImagses.getData()) {
                        //加入网络图片地址
                        images.add(dataBean.getImgUrl());
                    }
                    banner.setImages(images);
                    banner.start();
    
                }
    
                @Override
                protected 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>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    writeResponseBodyToDisk(response.body());
                }
    
                @Override
                public 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
        @GET
        Call<ResponseBody> downloadLatestFeature(@retrofit2.http.Url String fileUrl);
    

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

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

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

    相关文章

      网友评论

          本文标题:Android轮播图图片的本地保存及读取

          本文链接:https://www.haomeiwen.com/subject/oygahftx.html