我是靠谱客的博主 时尚毛衣,最近开发中收集的这篇文章主要介绍PhotoView无法显示大图片问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

PhotoView无法显示大图片,这些日子做的聊天IM程序,需要预览图片,一开始使用的是PhotoView,没有任何毛病,可是当对方发过来一张长截图的时候却显示不了了,自己很烦,自己又去自定义了一个ImageView,可是效果依然是一样;而且Bitmap还老是报出OOM,没办法,我只能先判断图片的大小、判断图片分辨率,如果超过了480*800*3就将图片的宽度高度设置为原来的二分之一,好了问题完美解决;以下是代码:

Bitmap bitmap;
if (size <= 480 * 800 * 3) {
//ARGB_8888 表示32位的ARGB位图占用4个字节

bitmap = BitmapFactory.decodeFile(cachePath);
} else {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一

bitmap = BitmapFactory.decodeFile(cachePath, options);
}
pv.setImageBitmap(bitmap);
虽然问题解决,可是总还是感觉不爽,因为这样有的图片的清晰度还是不够,分辨率不够,没办法,最后只能放弃使用PhotoView了,而是使用了
SubsamplingScaleImageView这个控件,大家可以上网找;
不过该控件不能直接将url作为资源将图片显示出来,而是要先将图片下载到本地,然后再通过本地路径再去将图片放到控件当中
以下是代码:
private void downloadImageAndShow(String msgId,String path, SubsamplingScaleImageView bivPic){
//下载图片并显示
String destFileDir = Environment.getExternalStorageDirectory() + "/hz_tencent_clound_images";
File dir = new File(destFileDir);
final File file = new File(destFileDir, msgId + "." + path.substring(path.lastIndexOf(".") + 1));
Log.e("fileUrl", path);
if (!dir.exists()) {
//路径不存在,创建并下载图片

dir.mkdirs();
//TODO 下载图片并显示

downloadImageAndShow(bivPic,file,path);
} else {
//路径存在,直接下载图片

if (file.exists()) {
//路径存在包括可能说明文件也存在,直接显示

showImage(bivPic,file.getPath());
}else{
//TODO 下载图片并显示

downloadImageAndShow(bivPic,file, path);
}
}
}
private Handler mHandler = new Handler();
private void downloadImageAndShow(final SubsamplingScaleImageView bivPic,File file,String fileUrl){
SystemApi systemApi = new SystemApi();
systemApi.downLoadSoundFile(file, fileUrl, new DownLoadSoundCallBack() {
@Override

public void errorCallBack(Call call, final Exception e) {
Runnable uiRunnable = new Runnable() {
@Override

public void run() {
Log.e(TAG, e.getMessage());
}
};
mHandler.post(uiRunnable);
}
@Override

public void succCallBack(final String path) {
Runnable uiRunnable = new Runnable() {
@Override

public void run() {
showImage(bivPic,path);
}
};
mHandler.post(uiRunnable);
}
});
}
private void showImage(SubsamplingScaleImageView imageView,String path){
imageView.setImage(ImageSource.uri(path));
}
其中downLoadSoundFile方法的代码如下:
public void downLoadSoundFile(final File file, String fileUrl, final DownLoadSoundCallBack callBack) {
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder().url(fileUrl).build();
final Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override

public void onFailure(Call call, IOException e) {
callBack.errorCallBack(call, e);
}
@Override

public void onResponse(Call call, Response response) throws IOException {
InputStream is = null;
byte[] buf = new byte[2048];
int len = 0;
FileOutputStream fos = null;
try {
is = response.body().byteStream();
fos = new FileOutputStream(file);
while ((len = is.read(buf)) != -1) {
current += len;
fos.write(buf, 0, len);
}
fos.flush();
} catch (IOException e) {
callBack.errorCallBack(null, e);
} finally {
try {
if (is != null) {
is.close();
}
if (fos != null) {
fos.close();
}
callBack.succCallBack(file.getPath());
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
}
});
}
个人觉得downLoadSoundFile方法还是有其他方式可以进行改善,欢迎大家提供一个更好的方式,谢谢

最后

以上就是时尚毛衣为你收集整理的PhotoView无法显示大图片问题的全部内容,希望文章能够帮你解决PhotoView无法显示大图片问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部