关于 android P ImageDecoder 的使用讲解
程序员文章站
2022-10-30 16:15:55
一个的可以将png, jpeg, webp, gif, or heif 格式的图片的转换成drawable 或者bitmap 对象的类。
要使用它, 首先使用createsource 创...
一个的可以将png, jpeg, webp, gif, or heif 格式的图片的转换成drawable 或者bitmap 对象的类。
要使用它, 首先使用createsource 创建一个source, 例如解码一个文件使用createsource(file) ,将返回值传入decodedrawable(source) 或者 decodebitmap(source):
file file = new file(...); imagedecoder.source source = imagedecoder.createsource(file); drawable drawable = imagedecoder.decodedrawable(source);
source是可以复用的方需要,将图片解码成不同的形态,例如修改宽高。
第二方法还可以传递onheaderdecodedlistener,这里imageinfo存放的是原始的图片的宽和高。可以修改用来修改图片宽高的时候修改samplesize。
onheaderdecodedlistener listener = new onheaderdecodedlistener() { public void onheaderdecoded(imagedecoder decoder, imageinfo info, source source) { decoder.settargetsamplesize(2); } }; drawable drawable = imagedecoder.decodedrawable(source, listener);
如果要解码的图片是gif,会被解码成animatedimagedrawable 使用方法如下:
drawable drawable = imagedecoder.decodedrawable(source); if (drawable instanceof animatedimagedrawable) { ((animatedimagedrawable) drawable).start(); }
默认解码出来的bitmap是不可变,但是仍然可以使用postprocessor来添加一些自定义的效果,例如:
drawable drawable = imagedecoder.decodedrawable(source, (decoder, info, src) -> { decoder.setpostprocessor((canvas) -> { // this will create rounded corners. //创建圆角照片 path path = new path(); path.setfilltype(path.filltype.inverse_even_odd); int width = canvas.getwidth(); int height = canvas.getheight(); path.addroundrect(0, 0, width, height, 20, 20, path.direction.cw); paint paint = new paint(); paint.setantialias(true); paint.setcolor(color.transparent); paint.setxfermode(new porterduffxfermode(porterduff.mode.src)); canvas.drawpath(path, paint); return pixelformat.translucent; }); });
如果解码的照片是不完整的或者包含错误,解码的时候会抛出decodeexception,一些情况下,可能已经解码出一部分的照片,这个时候传递onpartialimagelistener ,并返回true,就只显示解码出来的部分,剩余部分使用空白代替。
drawable drawable = imagedecoder.decodedrawable(source, (decoder, info, src) -> { decoder.setonpartialimagelistener((decodeexception e) -> { // returning true indicates to create a drawable or bitmap even // if the whole image could not be decoded. any remaining lines // will be blank. return true; }); });
有错误的地方,欢迎指正,谢谢。
上一篇: 里面黄外面也黄
下一篇: android 签名文件的保存办法
推荐阅读
-
Android中实现异步任务机制的AsyncTask方式的使用讲解
-
ubuntu android studio中关于NDK的使用介绍
-
Android开发学习之控件GridView的使用讲解
-
分享 Xamarin.android 关于使用SQLiteOpenHelper的小白经验
-
实例讲解Android Fragment的两种使用方法
-
Android中SQLite的使用讲解
-
了解关于Android-Context的含义和使用实例
-
关于编译Android下可执行命令的FFmpeg实例讲解
-
关于mysql数据库中distinct,concat,ifnull的使用讲解
-
Appium python自动化测试系列教程之关于Android知识的讲解(三)