UniversalImageloader 加载图片模糊问题的解决办法
2016-01-11 15:03
489 查看
前因后果不废话了,直接总结了:
UniversalImageloader请求加载的图片,在动态高度情况下会有模糊情况发生。经自己测试和网上翻阅资料,解决方式有三:
1. 若设置了默认高度(非WRAP_CONTENT、MATCH_PARENT),想在图片加载后动态高度,在请求图片前能提前知道图片高度的情况下(看api设计),可以在调用displayImage前先调整imageView的LayoutParams.height。因为Imageloader在请求到图片后,会参考imageView宽高(道听途说,没看代码)
2. 在调用的displayImage方法中增加回调ImageLoadingListener,在加载完成后调整imageView高度
Java代码
ImageLoader.getInstance().displayImage(imgUrl, imageView, App.options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String arg0, View arg1) {}
@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {}
@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap bitmap) {
LayoutParams params = productImage.getLayoutParams();
params.height = (int)(ScreenUtils.WIDTH / bitmap.getWidth() * bitmap.getHeight());
}
@Override
public void onLoadingCancelled(String arg0, View arg1) {}
});
3. 框架作者给的解决方法,通过imageView.post()去调用displayImage
Java代码
imageView.post(new Runnable(){
@Override
public void run(){
ImageLoader.getInstance().displayImage(imgUrl, imageView, App.options);
}
});
具体用哪种,看个人喜好吧。
如果通过以上任意一种方式后,图片看上去比原图还是模糊,别乱找了,肯定options设置问题。
Java代码
options = new DisplayImageOptions.Builder()
...
.cacheInMemory(true) //设置下载的图片是否缓存在内存中
.cacheOnDisk(true) //设置下载的图片是否缓存在SD卡中
.considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.EXACTLY)//设置图片以如何的编码方式显示
<span style="background-color: #ffffff; color: #ff0000;">.bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//</span>
...
如果你也是网上扒来的例子,十有八九是上边这样,问题就出在红色字体那行设置图片解码器上,查查资料就会发现,RGB_565是把图像压缩了的,如果你的图片本身有渐变色,用这个解码器解出来的图片看上会有尿布晾干那种痕迹;不过图片质量高的情况下问题不大。我们看下解释:
ALPHA_8 代表8位Alpha位图
ARGB_4444 代表16位ARGB位图,由4个4位组成
ARGB_8888 代表32位ARGB位图,由4个8位组成
RGB_565 代表16位RGB位图,R为5位,G为6位,B为5位
既然问题找到,直接换ARGB_8888 真彩色,效果就是原图那样了。
UniversalImageloader请求加载的图片,在动态高度情况下会有模糊情况发生。经自己测试和网上翻阅资料,解决方式有三:
1. 若设置了默认高度(非WRAP_CONTENT、MATCH_PARENT),想在图片加载后动态高度,在请求图片前能提前知道图片高度的情况下(看api设计),可以在调用displayImage前先调整imageView的LayoutParams.height。因为Imageloader在请求到图片后,会参考imageView宽高(道听途说,没看代码)
2. 在调用的displayImage方法中增加回调ImageLoadingListener,在加载完成后调整imageView高度
Java代码
ImageLoader.getInstance().displayImage(imgUrl, imageView, App.options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String arg0, View arg1) {}
@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {}
@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap bitmap) {
LayoutParams params = productImage.getLayoutParams();
params.height = (int)(ScreenUtils.WIDTH / bitmap.getWidth() * bitmap.getHeight());
}
@Override
public void onLoadingCancelled(String arg0, View arg1) {}
});
3. 框架作者给的解决方法,通过imageView.post()去调用displayImage
Java代码
imageView.post(new Runnable(){
@Override
public void run(){
ImageLoader.getInstance().displayImage(imgUrl, imageView, App.options);
}
});
具体用哪种,看个人喜好吧。
如果通过以上任意一种方式后,图片看上去比原图还是模糊,别乱找了,肯定options设置问题。
Java代码
options = new DisplayImageOptions.Builder()
...
.cacheInMemory(true) //设置下载的图片是否缓存在内存中
.cacheOnDisk(true) //设置下载的图片是否缓存在SD卡中
.considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.EXACTLY)//设置图片以如何的编码方式显示
<span style="background-color: #ffffff; color: #ff0000;">.bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//</span>
...
如果你也是网上扒来的例子,十有八九是上边这样,问题就出在红色字体那行设置图片解码器上,查查资料就会发现,RGB_565是把图像压缩了的,如果你的图片本身有渐变色,用这个解码器解出来的图片看上会有尿布晾干那种痕迹;不过图片质量高的情况下问题不大。我们看下解释:
ALPHA_8 代表8位Alpha位图
ARGB_4444 代表16位ARGB位图,由4个4位组成
ARGB_8888 代表32位ARGB位图,由4个8位组成
RGB_565 代表16位RGB位图,R为5位,G为6位,B为5位
既然问题找到,直接换ARGB_8888 真彩色,效果就是原图那样了。
相关文章推荐
- Android Intent应用,打开网页,安装程序,打电话,打开地图等功能
- linux下mysql配置文件my.cnf详解
- 剑—二叉树中和为某一值的路径
- Fail to decode request due to: RpcInvocation
- YTU 2900: F-A Simple Question
- STM8S---IO复用配置(STVP方式)
- Android Studio/Gradle构建过慢
- 学习计划2016.1
- corosync集群下的双心跳多资源组配置小结
- JavaScript中的boolean类型判断
- pt-table-checksum 原理解析
- 关于RGraph(html5 canvas )绘图
- java访问Linux服务器读取文件
- iOS开发之UICollectionView(二)
- SAP S/4HANA
- 通过/proc/net/dev分析网络包量,流量,错包,丢包
- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined ;At least one of these environment variable is needed to run this program
- javascript工厂模式、单例模式
- leetcode205---Isomorphic Strings(相同结构的字符串)
- Lua中的模块与module函数详解