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