Android进阶之路 - 动态切换不同时长的图片

之前有一个类似轮播banner小需求,今天抽时间记录一下 ~

一听到轮播图的效果,很多人下意识的会想到Viewpager,因为这款控件挺成熟,而且内部包含手势的滑动、点击都有很成熟的方案;

但是此篇的效果就是动态展示图片,只不过每张图片的展示时长不同,目前内部不支持手势滑动,如果需要点击那么自己分分钟实现一下吧~

对了,为了方便体验, 此demo已经上传,只需更改内部的图片路径地址即可 ~

实现效果 ~
在这里插入图片描述
主要需求

  • 动态切换图片
  • 每张图片停留时长不同
  • 图片缓存
  • 无手势功能,如滑动、点击功能

常规实现采用ViewPager或三方banner框架,从优化的角度看待这俩种方式将产生无用资源~ 故最终采用了简单的ImageView+递归实现需求 ~

BannerInfo
必要参数:展示图、展示时长

package nk.com.newglidetool;

/**
 * @author MrLiu
 * @date 2020/4/10
 * desc 
 */
public class BannerInfo {
    
    
    public int time;
    public String banner;

    public BannerInfo() {
    
    
        super();
    }

    public BannerInfo(String banner, int time) {
    
    
        this.banner = banner;
        this.time = time;
    }

    public int getTime() {
    
    
        return time;
    }

    public void setTime(int time) {
    
    
        this.time = time;
    }

    public String getBanner() {
    
    
        return banner;
    }

    public void setBanner(String banner) {
    
    
        this.banner = banner;
    }
}

MainActivity
实现关键,在于递归这个小知识点 ~

package nk.com.newglidetool;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    
    
    private CountDownTimer countDownTimer;
    private TextView time;
    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        img = findViewById(R.id.iv_img);
        time = findViewById(R.id.iv_time);

        List<BannerInfo> bannerList = new ArrayList<>();
        bannerList.add(new BannerInfo("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1600336490015&di=dfc02c761130ed9bf51ab74a11410f9d&imgtype=0&src=http%3A%2F%2Fcdn.duitang.com%2Fuploads%2Fitem%2F201402%2F20%2F20140220220726_YvyRR.thumb.700_0.jpeg", 5));
        bannerList.add(new BannerInfo("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1600336490017&di=788d40031beaaaca18f9d8bb7fbd41ca&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fsoftbbs%2F1003%2F07%2Fc0%2F3134443_1267900790753_1024x1024soft.jpg", 7));
        bannerList.add(new BannerInfo("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1600336496883&di=0fec2c50be8443e19caaff067b9b6904&imgtype=0&src=http%3A%2F%2Fimg2.imgtn.bdimg.com%2Fit%2Fu%3D1032090787%2C3027113824%26fm%3D214%26gp%3D0.jpg", 10));

        startBanner(bannerList, bannerList.get(bannerSize).getTime());
    }

    /**
     * Banner切换
     **/
    private int bannerSize = 0;

    void startBanner(final List<BannerInfo> bannerList, int interval) {
    
    
        countDownTimer = new CountDownTimer(interval * 1000 + 80, 1000) {
    
    
            @Override
            public void onTick(long millisUntilFinished) {
    
    
                if (bannerList.size() > 0) {
    
    
                    if (bannerSize == 0) {
    
    
                        GlideUtils.initImageWithFileCache(MainActivity.this, bannerList.get(bannerSize).getBanner(), img);
                    }
                }
                time.setText(millisUntilFinished / 1000 + " s");
            }

            @Override
            public void onFinish() {
    
    
                bannerSize++;
                if (bannerSize >= bannerList.size()) {
    
    
                    bannerSize = 0;
                }
                if (bannerList.size() > 0) {
    
    
                    GlideUtils.initImageWithFileCache(MainActivity.this, bannerList.get(bannerSize).getBanner(), img);
                    countDownTimer.cancel();
                    startBanner(bannerList, bannerList.get(bannerSize).getTime());
                }
            }
        };
        countDownTimer.start();
    }

    @Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        if (countDownTimer != null) {
    
    
            countDownTimer.cancel();
        }
        GlideUtils.clearFileCache(this);
        GlideUtils.clearMemoryCache(this);
    }
}

Glide图片缓存

权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET" />

清单

扫描二维码关注公众号,回复: 12913615 查看本文章
    //这里用的是Android Studio3.0
    implementation 'com.github.bumptech.glide:glide:4.3.1'
    annotationProcessor('com.github.bumptech.glide:compiler:4.3.1')
    implementation 'com.github.bumptech.glide:okhttp3-integration:4.3.1'

CustomGlideModule

package nk.com.newglidetool;

import android.content.Context;

import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.LruResourceCache;
import com.bumptech.glide.module.AppGlideModule;

/**
 * @author MrLiu
 * @date 2020/8/26
 * desc
 */
@GlideModule
public class CustomGlideModule extends AppGlideModule {
    
    
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
    
    
        //        设置缓存大小为20mb
        int memoryCacheSizeBytes = 1024 * 1024 * 30; // 30mb
        //        设置内存缓存大小
        builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
        //        根据SD卡是否可用选择是在内部缓存还是SD卡缓存
        if (isSDCardEnable()) {
    
    
            builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context, "HYManagerImages", memoryCacheSizeBytes));
        } else {
    
    
            builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "HYManagerImages", memoryCacheSizeBytes));
        }
    }

    //    针对V4用户可以提升速度
    @Override
    public boolean isManifestParsingEnabled() {
    
    
        return false;
    }

    /**
     * 查看是否存在SD卡
     */
    private boolean isSDCardEnable() {
    
    
        if (android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED)) {
    
    
            return true;
        } else
            return false;
    }
}

GlideUtils

package nk.com.newglidetool;

import android.content.Context;
import android.widget.ImageView;

import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;

/**
 * @author MrLiu
 * @date 2020/8/26
 * desc
 */
public class GlideUtils {
    
    

    /**
     * 磁盘缓存
     */
    public static void initImageWithFileCache(Context context, String url, ImageView imageView) {
    
    
        GlideApp.with(context)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)
                .transition(DrawableTransitionOptions.withCrossFade(100))//淡入淡出100m
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .dontAnimate()
                .centerCrop()
                .into(imageView);
    }

    /**
     * Glide跳过内存缓存
     */
    public static void initImageNoCache(Context context, String url, ImageView imageView) {
    
    
        GlideApp.with(context)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)
                .skipMemoryCache(true)
                .dontAnimate()
                .centerCrop()
                .into(imageView);
    }

    /**
     * 内存缓存清理(主线程)
     */
    public static void clearMemoryCache(Context context) {
    
    
        GlideApp.get(context).clearMemory();
    }

    /**
     * 磁盘缓存清理(子线程)
     */
    public static void clearFileCache(final Context context) {
    
    
        new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                GlideApp.get(context).clearDiskCache();
            }
        }).start();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_20451879/article/details/108644221