热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Android开发-----显示长图

问题ImageView加载长图的时候,由于有长度上的限制,所以遇到过长图片的时候,无法完全显示,解决方案方法一:使用subsampling-scale-image

; new ShowLongImgAsyncTask().execute(path); }
/** * 自定义AsyncTask */ class ShowLongImgAsyncTask extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); imageView.setImageBitmap(null); }
@Override
protected void onPostExecute(File result) { super.onPostExecute(result); if (result != null) { if (file != null && file.exists()) { Bitmap bitmap = BitmapFactory.decodeFile(result.getAbsolutePath(), getBitmapOption(1)); imageView.setImageBitmap(bitmap); } } else { System.out.println("---------文件为null-----------"); } }
@Override
protected File doInBackground(String... params) { File b = getImageBitmap(params[0]); return b; } }

/** * HttpUrlConnection访问网络 * 并下载图片到本地 * @param url * @return */ private File getImageBitmap(String url) { URL imgurl = null; Bitmap bitmap = null; File file = null; HttpURLConnection urlConnection; try { imgurl = new URL(url); urlConnection = (HttpURLConnection) imgurl.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.connect(); InputStream is = urlConnection.getInputStream(); //构建一个file对象用于存储图片 file = new File(Environment.getExternalStorageDirectory(), "pic.jpg"); fos = new FileOutputStream(file); int len = 0; byte[] buffer = new byte[1024]; //将输入流写入到我们定义好的文件中 while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); }

is.close(); fos.close(); }
catch (IOException e) { e.printStackTrace(); } return file; }
/** * 设置Bitmap的Options */ private BitmapFactory.Options getBitmapOption(int inSampleSize) { System.gc(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true; options.inSampleSize = inSampleSize; return options; }

 

这个和方法二都是将图片下载到本地,然后转为Bitmap设置给ImageView, 
但是如果不存文件,而是直接一个Bitmap,也能实现同样的效果

/**
* HttpUrlConnection访问网络
* 并下载图片到本地
* @param url
* @return
*/
private Bitmap getImageBitmap(String url) {
    URL imgurl = null;
    Bitmap bitmap = null;
    File file = null;
    HttpURLConnection urlConnection;
    try {
        imgurl = new URL(url);
        urlConnection = (HttpURLConnection)
        imgurl.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();
        InputStream is = urlConnection.getInputStream();
        bitmap = BitmapFactory.decodeStream(is);
        is.close();
        return bitmap;
    } catch (IOException e) {
        e.printStackTrace();
}
return null; }
class ShowLongImgAsyncTask extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); imageView.setImageBitmap(null); }
@Override
protected void onPostExecute(Bitmap result) { super.onPostExecute(result); if (result != null) { if (file != null && file.exists()) { imageView.setImageBitmap(result); } } else { System.out.println("---------文件为null-----------"); } }
@Override
protected Bitmap doInBackground(String... params) { Bitmap b = getImageBitmap(params[0]); return b; } }

!!!不要忘记设置

android:adjustViewBounds="true"

由此方法一和方法二可推测,使用方式或框架,将图片下载到本地,然后经bitmap处理,都应该能正常显示

方法四:快速解决方案 使用WebView

在做这个功能的时候,突发奇想,既然WebView是可以加载一个链接地址的,那么从网络获取的图片也是一个链接地址,那么应该也可以使用WebView来解决这个长图的问题

webView = (WebView) findViewById(R.id.webView);
webView.loadUrl("http://192.168.3.162:8080/gotoclass/test.jpg");

但是如果仅仅这么做,图片有可能在宽度上出现显示问题,所以还要让它适应屏幕缩放

WebSettings settings = webView.getSettings();
// 设置可任意缩放
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);

 

方法五:BitmapRegionDecoder

  还有一种是通过BitmapRegionDecoder来显示局部图片一点点加载的,似乎可行,由于项目时间紧,没有仔细研究

 

如有错误, 敬请指正, 感激不尽!


推荐阅读
author-avatar
小白学习
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有