读书人

异步加载图片图片变的有些小不能完全

发布时间: 2013-03-19 17:22:05 作者: rapoo

异步加载图片图片变的有点小,不能完全铺满给定的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尺寸

读书人网 >Android

热点推荐