首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

异步加载图片图片变的有些小,不能完全铺满给定的imageview的空间

2013-03-19 
异步加载图片图片变的有点小,不能完全铺满给定的imageview的空间[imghttp://][/img]要的是这四张全部铺满

异步加载图片图片变的有点小,不能完全铺满给定的imageview的空间
[img=http://][/img]要的是这四张全部铺满各自的imageview,可是异步加载出来怎么也不能铺满【原图的大小绝对是可以满足这单个的大小的】
布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >

        <LinearLayout
            android:id="@+id/lin1"
            android:layout_width="263px"
            android:layout_height="fill_parent"
            android:orientation="vertical" >

            <ImageView
                android:id="@+id/show_item1"
                android:layout_width="263px"
                android:layout_height="372px"
                android:background="@color/white"/>
            

            <ImageView
                android:id="@+id/show_item3"
                android:layout_width="263px"
                android:layout_height="fill_parent"
                android:layout_marginTop="4px"
                android:background="@color/white"/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="214px"
            android:layout_height="fill_parent"
            android:layout_marginLeft="4px"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/show_item2"
                android:layout_width="214px"
                android:layout_height="411px" 
                android:background="@color/white"/>

            <ImageView


                android:layout_marginTop="4px"
                android:id="@+id/show_item4"
                android:layout_width="214px"
                android:layout_height="fill_parent"
                android:background="@color/white"/>
        </LinearLayout>
    </LinearLayout>

</LinearLayout>


调用  
imageloader.DisplayImage(map.get("img1").toString(), img1);
imageloader.DisplayImage(map.get("img2").toString(), img2);
imageloader.DisplayImage(map.get("img3").toString(), img3);
imageloader.DisplayImage(map.get("img4").toString(), img4);

imageloader类如下:

package com.android.diy.client.utils.imageloader;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;

import com.android.diy.client.activity.R;

public class ImageLoader {
 

    MemoryCache memoryCache = new MemoryCache();
    FileCache fileCache;
    private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
    Context context;
    // 线程池
    ExecutorService executorService;
    public ImageLoader(Context context) {
            fileCache = new FileCache(context);
            this.context=context;
            executorService = Executors.newFixedThreadPool(5);

    }
    public void DisplayImage(String url, ImageView imageView) {
            imageViews.put(imageView, url);
            Bitmap bitmap = memoryCache.get(url);
            if (bitmap != null)
               imageView.setImageBitmap(bitmap);
            else {
                queuePhoto(url, imageView);


            }

    }


    private void queuePhoto(String url, ImageView imageView) {
            PhotoToLoad p = new PhotoToLoad(url, imageView);
            executorService.submit(new PhotosLoader(p));

    }
    public Bitmap getBitmap(String url) {
            File f = fileCache.getFile(url);
            // 先从文件缓存中查找是否有
            Bitmap b = decodeFile(f);
            if (b != null)
                    return b;
            // 最后从指定的url中下载图片
            try {
                    Bitmap bitmap = null;
                    URL imageUrl = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
                    conn.setConnectTimeout(30000);
                    conn.setReadTimeout(30000);
                    conn.setInstanceFollowRedirects(true);
                    try {
                        InputStream is = conn.getInputStream();
                        OutputStream os = new FileOutputStream(f);
                        CopyStream(is, os);
                        os.close();
                        bitmap = decodeFile(f);
} catch (Exception e) {
  bitmap=BitmapFactory.decodeResource(context.getResources(), R.drawable.deafult);

}
                    return bitmap;
            } catch (Exception ex) {

                    ex.printStackTrace();



                    return null;

            }

    }


    // decode这个图片并且按比例缩放以减少内存消耗,虚拟机对每张图片的缓存大小也是有限制的
    private Bitmap decodeFile(File f) {
            try {
                    BitmapFactory.Options o = new BitmapFactory.Options();
//                    o.inJustDecodeBounds = true;
//                    BitmapFactory.decodeStream(new FileInputStream(f), null, o);
//                    final int REQUIRED_SIZE = 70;
//                    int width_tmp = o.outWidth, height_tmp = o.outHeight;
//                    int scale = 1;
//                    while (true) {
//                            if (width_tmp / 2 < REQUIRED_SIZE
//                                            || height_tmp / 2 < REQUIRED_SIZE)
//                                    break;
//                            width_tmp /= 2;
//                            height_tmp /= 2;
//                            scale *= 2;
//
//                    }


                    // decode with inSampleSize

//                    BitmapFactory.Options o2 = new BitmapFactory.Options();

//                    o2.inSampleSize = scale;

//                    return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);


                    return BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            } catch (FileNotFoundException e) {

            }

            return null;

    }


    // Task for the queue

    private class PhotoToLoad {

            public String url;

            public ImageView imageView;


            public PhotoToLoad(String u, ImageView i) {

                    url = u;

                    imageView = i;

            }

    }
    class PhotosLoader implements Runnable {
            PhotoToLoad photoToLoad;
            PhotosLoader(PhotoToLoad photoToLoad) {
                    this.photoToLoad = photoToLoad;
            }
            public void run() {

                    if (imageViewReused(photoToLoad))

                            return;

                    Bitmap bmp = getBitmap(photoToLoad.url);

                    memoryCache.put(photoToLoad.url, bmp);

                    if (imageViewReused(photoToLoad))

                            return;

                    BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);

                    // 更新的操作放在UI线程中

                    Activity a = (Activity) photoToLoad.imageView.getContext();

                    a.runOnUiThread(bd);



            }

    }


    /**

     * 防止图片错位

     * 
     * @param photoToLoad

     * @return

     */

    boolean imageViewReused(PhotoToLoad photoToLoad) {

            String tag = imageViews.get(photoToLoad.imageView);

            if (tag == null || !tag.equals(photoToLoad.url))

                    return true;

            return false;

    }


    // 用于在UI线程中更新界面

    class BitmapDisplayer implements Runnable {

            Bitmap bitmap;

            PhotoToLoad photoToLoad;


            public BitmapDisplayer(Bitmap b, PhotoToLoad p) {

                    bitmap = b;

                    photoToLoad = p;

            }


            public void run() {

                    if (imageViewReused(photoToLoad))

                            return;

                    if (bitmap != null)

                            photoToLoad.imageView.setImageBitmap(bitmap);

              

    

            }

    }


    public void clearCache() {

            memoryCache.clear();

            fileCache.clear();

    }


    public static void CopyStream(InputStream is, OutputStream os) {

            final int buffer_size = 1024;

            try {

                    byte[] bytes = new byte[buffer_size];



                    for (;;) {

                            int count = is.read(bytes, 0, buffer_size);

                            if (count == -1)

                                    break;

                            os.write(bytes, 0, count);

                    }

            } catch (Exception ex) {

            }

    }
    
    
    public static Bitmap getImage(String Url) throws Exception {
     
try {
 
URL url = new URL(Url);
 
String responseCode = url.openConnection().getHeaderField(0);
 
if (responseCode.indexOf("200") < 0)
 
throw new Exception("图片文件不存在或路径错误,错误代码:" + responseCode);
 

return BitmapFactory.decodeStream(url.openStream());
 
} catch (IOException e) {
 
// TODO Auto-generated catch block
 
throw new Exception(e.getMessage());
 
}
 
}

}


出来的效果如图【不知道图片能不能看得到,上传的貌似传不上去】   要的结果就是每个图片把各自对应的imageview给铺满 android layout url
[解决办法]
看不到图片,不知道楼主具体什么意思……
猜测:你可以为ImageView设置scaleType属性为fitXY,图片会自动拉伸到ImageView尺寸

热点排行