Android开发笔记(一百八十)使用Glide加载特殊图像

Posted aqi00

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发笔记(一百八十)使用Glide加载特殊图像相关的知识,希望对你有一定的参考价值。

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动图临近播放结束时的界面。

 

除了支持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加载视频封面的效果如下面两图所示,分别为挑选视频的界面,以及加载封面的效果。

 

 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开发笔记的完整目录

以上是关于Android开发笔记(一百八十)使用Glide加载特殊图像的主要内容,如果未能解决你的问题,请参考以下文章

Android开发笔记(一百八十)使用Glide加载特殊图像

Android开发笔记(一百八十五)使用设备浏览器Device File Explorer导出存储卡的文件

Android开发笔记(一百八十五)使用设备浏览器Device File Explorer导出存储卡的文件

Android开发笔记(一百八十五)使用设备浏览器Device File Explorer导出存储卡的文件

Android开发笔记(一百八十五)使用设备浏览器Device File Explorer导出存储卡的文件

Android开发笔记(一百八十二)使用CameraX录像