Android 图片自适应adapter demo


有时我们需要完成类似上图的效果,只要图片宽度固定,高度自匹配就可以。


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);
	}

}


下载地址


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值