Android开发-----显示长图
问题
ImageView加载长图的时候,由于有长度上的限制,所以遇到过长图片的时候,无法完全显示,
解决方案
方法一:使用subsampling-scale-image-view库
在网上一个论坛找到这个库的名字,然后github,的确可以加载长图,但是一时半会儿没有找到控制初始显示比例适应屏幕的方法,由于开发周期紧,所以不能花太多精力去研究这个库,所以没有使用
方法二:使用Glide+Bitmap
Glide.with(this).load(RequestUrl.BASE_URL + photoUrl) .downloadOnly(new SimpleTarget<File>() { @Override public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) { // 将保存的图片地址给SubsamplingScaleImageView,这里注意设置ImageViewState设置初始显示比例 Bitmap bitmap= BitmapFactory.decodeFile(resource.getAbsolutePath(),getBitmapOption(1)); // 显示处理好的Bitmap图片 imageView.setImageBitmap(bitmap); } });
另一种方法的解决思路是先将图片从网上下载到本地,然后经过Bitmap处理后,再加载
但是仅仅这样似乎还不够,然后想到了ImageView的adjustViewBounds属性,设置它为true
android:adjustViewBounds="true"
方法三:使用HttpUrlConnection + Bitmap
这个方法和方法二的思路是一模一样的,只是这个使用的android自己的HttpUrlConnection访问网络:
/**
<em>* 点击获取图片 * @param view */ public void start(View view) { final String path = "http://192.168.3.162:8080/gotoclass/test.jpg"; new ShowLongImgAsyncTask().execute(path); }<br />/** * 自定义AsyncTask */ class ShowLongImgAsyncTask extends AsyncTask<String, Void, File> { @Override protected void onPreExecute() { super.onPreExecute(); imageView.setImageBitmap(null); }<br /> @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-----------"); } }<br /> @Override protected File doInBackground(String... params) { File b = getImageBitmap(params[0]); return b; } } <br /><br />/** * 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); }<br /><br /> is.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } return file; }<br />/** * 设置Bitmap的Options */ private BitmapFactory.Options getBitmapOption(int inSampleSize) { System.gc(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true; options.inSampleSize = inSampleSize; return options; }</em>
这个和方法二都是将图片下载到本地,然后转为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();<br /> } return null; }<br />class ShowLongImgAsyncTask extends AsyncTask<String, Void, Bitmap> { @Override protected void onPreExecute() { super.onPreExecute(); imageView.setImageBitmap(null); }<br /> @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-----------"); } } <br /> @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来显示局部图片一点点加载的,似乎可行,由于项目时间紧,没有仔细研究
如有错误, 敬请指正, 感激不尽!