有时我们需要完成类似上图的效果,只要图片宽度固定,高度自匹配就可以。
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); } }
下载地址