有时我们需要完成类似上图的效果,只要图片宽度固定,高度自匹配就可以。
package com.cn.demo.ui;
import java.lang.ref.SoftReference;
import java.util.HashMap;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class Demo_Adapter extends BaseAdapter {
//获得索引文件
Activity context= null;
int[] array = new int[] { R.drawable.test1, R.drawable.test2,
R.drawable.test3, R.drawable.test4, R.drawable.test5,
R.drawable.test6, R.drawable.test7 };
//获得布局填充器
LayoutInflater inflater= null;
//获得屏幕分辨率
DisplayMetrics dm = null;
HashMap<Integer, SoftReference<Drawable>> cache = new HashMap<Integer, SoftReference<Drawable>>();
public Demo_Adapter(Activity context) {
// TODO Auto-generated constructor stub
this.context = context;
inflater = LayoutInflater.from(context);
dm = new DisplayMetrics();
//初始化获得屏幕分辨率
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return array.length;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int index, View convertView, ViewGroup arg2) {
//获得非空布局---------------------------------------------------------------
ImageView img = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item, null);
}
img = (ImageView) convertView.findViewById(R.id.p5_item_img);
//如果图片缓存已存在则从缓存中获得---------------------------------------------------------
if (img.getTag() != null
&& Integer.valueOf(img.getTag().toString()) != index
&& cache.get(index) != null && cache.get(index).get() != null) {
img.setBackgroundDrawable(cache.get(index).get());
}
//如果缓存不存在--------------------------------------------------------
if (cache.get(index) == null || cache.get(index).get() == null) {
//获得指定索引的图片资源
Drawable drawable = (Drawable) context.getResources().getDrawable(
array[index]);
//获得图片比值
float f = 1.0f * dm.widthPixels / drawable.getIntrinsicWidth();
//重新定义图片长宽
drawable =
zoomDrawable(drawable,
(int) (dm.widthPixels * dm.scaledDensity),
(int) (f * drawable
.getIntrinsicHeight()));
//显示图片
img.setBackgroundDrawable(drawable);
//标记一下
img.setTag(index);
}
// //-------------------------------------------------------------------
return convertView;
}
public static Bitmap drawableToBitmap(Drawable drawable) {
// 取 drawable 的长宽
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
// 取 drawable 的颜色格式
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565;
// 建立对应 bitmap
Bitmap bitmap = Bitmap.createBitmap(w, h, config);
// 建立对应 bitmap 的画布
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
// 把 drawable 内容画到画布中
drawable.draw(canvas);
return bitmap;
}
public static Drawable zoomDrawable(Drawable drawable, int w, int h) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
// drawable转换成bitmap
Bitmap oldbmp = drawableToBitmap(drawable);
// 创建操作图片用的Matrix对象
Matrix matrix = new Matrix();
// 计算缩放比例
float sx = ((float) w / width);
float sy = ((float) h / height);
// 设置缩放比例
matrix.postScale(sx, sy);
// 建立新的bitmap,其内容是对原bitmap的缩放后的图
Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,
matrix, true);
return new BitmapDrawable(newbmp);
}
}