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

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来显示局部图片一点点加载的,似乎可行,由于项目时间紧,没有仔细研究

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