Android从9.0开始增加了新的图像解码器ImageDecoder,该解码器支持直接读取GIF文件的图形数据,结合图形工具Animatable即可在图像视图上显示GIF动图。虽然通过ImageDecoder能够在界面上播放GIF动画,但是一方面实现代码有些臃肿,另一方面在Android9.0之后才支持,显然不太好用。现在有了Glide,轻松加载GIF动图不在话下,简简单单只需下面一行代码:


Glide.with(this).load(R.drawable.happy).into(iv_cover);


使用Glide播放GIF动画的效果如下面两图所示,分别为GIF动图播放开始时的界面,以及GIF动图临近播放结束时的界面。

Android Glide加载gif显示有重影 glide加载gif优化_ide

 

Android Glide加载gif显示有重影 glide加载gif优化_android_02

除了支持GIF动画,Glide甚至还能自动加载视频封面,也就是把某个视频文件的首帧画面渲染到图像视图上。这个功能可谓是非常实在,先展示视频封面,等用户点击后再开始播放,可以有效防止资源浪费。以加载本地视频的封面为例,首先到系统视频库中挑选某个视频,得到该视频的Uri对象后采用Glide加载,即可在图像视图上显示视频封面。视频挑选与封面加载代码示例如下:


// 注册一个善后工作的活动结果启动器,获取指定类型的内容
ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> {
    if (uri != null) { // 视频路径非空,则加载视频封面
        Glide.with(this).load(uri).into(iv_cover);
    }
});
findViewById(R.id.btn_local_cover).setOnClickListener(v -> launcher.launch("video/*"));


使用Glide加载视频封面的效果如下面两图所示,分别为挑选视频的界面,以及加载封面的效果。

Android Glide加载gif显示有重影 glide加载gif优化_ide_03

 

Android Glide加载gif显示有重影 glide加载gif优化_glide_04

 Glide不仅能加载本地视频的封面,还能加载网络视频的封面。当然,由于下载网络视频很消耗带宽,因此要事先指定视频帧所处的时间点,这样Glide只会加载该位置的视频画面,无需下载整个视频。指定视频帧的时间点,用到了RequestOptions类的frameOf方法,具体的请求参数构建代码如下所示:


// 获取指定时间点的请求参数
private RequestOptions getOptions(int position) {
    // 指定某个时间位置的帧,单位微秒
    RequestOptions options = RequestOptions.frameOf(position*1000*1000);
    // 获取最近的视频帧
    options.set(VideoDecoder.FRAME_OPTION, MediaMetadataRetriever.OPTION_CLOSEST);
    // 执行从视频帧到位图对象的转换操作
    options.transform(new BitmapTransformation() {
        @Override
        protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
            return toTransform;
        }

        @Override
        public void updateDiskCacheKey(MessageDigest messageDigest) {
            try {
                messageDigest.update((getPackageName()).getBytes(StandardCharsets.UTF_8));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    return options;
}


接着调用Glide的apply方法设置请求参数,并加载网络视频的封面图片,详细的加载代码示例如下:


// 加载第10秒处的视频画面
findViewById(R.id.btn_network_one).setOnClickListener(v -> {
    // 获取指定时间点的请求参数
    RequestOptions options = getOptions(10);
    // 加载网络视频的封面图片
    Glide.with(this).load(URL_MP4).apply(options).into(iv_cover);
});
// 加载第45秒处的视频画面
findViewById(R.id.btn_network_nine).setOnClickListener(v -> {
    // 获取指定时间点的请求参数
    RequestOptions options = getOptions(45);
    // 加载网络视频的封面图片
    Glide.with(this).load(URL_MP4).apply(options).into(iv_cover);
});


Glide加载网络视频封面的效果如下面两图所示,分别为加载视频第10秒时候的画面,以及加载视频第45秒时候的画面。

Android Glide加载gif显示有重影 glide加载gif优化_加载_05

 

Android Glide加载gif显示有重影 glide加载gif优化_网络视频_06

 

 

 

点此查看Android开发笔记的完整目录