要的是这四张全部铺满各自的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给铺满androidlayouturl
布局文件如下:<?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给铺满androidlayouturl
解决方案 »
- canvas图片旋转
- Unable to read workbench state. Workbench UI layout will be reset.
- 安卓程序中怎么样把变量中的数据 显示在activity界面上?
- NDK 使用C++ 如何配置环境 网上大多是配置C
- 如何重写ListView onMeasure方法,使其能在ScrollView中计算出正确高度
- android视频传输的一个问题
- 怎么样把图片存到sd卡的cache中
- Locale 类里面有没有设置获得当前是什么设置语言的方法
- android studio中使用 startActivity(intent);一直都是红色的显示错误
- Html.fromHtml
- Android程序如何使用Google Analytics进行程序统计
- 下面paint的几个常量都表示什么意思
猜测:你可以为ImageView设置scaleType属性为fitXY,图片会自动拉伸到ImageView尺寸
把布局文件中ImageView的px改为dp,px是和分辨率相关的单位,使用dp使ImageView根据设备自动调整到对应尺寸,另:dp是官方建议使用单位,如density=240(hdpi)的设备上,1dp=1.5px;在density=160(mdpi)上,1dp=1px 希望对你有帮助