您的位置:首页 > 移动开发 > Android开发

Android——动态缩放图片

2016-05-14 16:43 351 查看
最近学习自定义view控件的过程碰到需要根据控件本身的大小动态绘制图片,主要用到了以下三种方法进行图像缩放

首先,先从文件资源里加载bitmap

Bitmap bitmpSrc=BitmapFactory.decodeResource(getResources(),R.drawable.img1);
//取得图片本身宽和高
int srcW=bitmapSrc.getWidth();
int srcH=bitmapSrc.getHeight();

//还要在onMeasure中获得当前的view的宽和高
width=MeasureSpec.getSize(widthMeasureSpec);
height=MeasureSpec.getHeight(heightMeasureSpec);

//计算缩放比例
scaleW=width*1.0f/srcW;
scaleH=height*1.0f/srcH;


下面介绍三种bitmap的缩放操作(Bitmap图片本身不能改变的,要通过新建一张Bitmap,在上面绘制图像)

1.利用canvas本身的scale

//创建一个View大小的Bitmap;
Bitmap bm=Bitmap.create(width,height,Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(bm);//在新建的bm上绘制
canvas.scale(scaleW,scaleH);//将画布结构先进行缩放
canvas.drawBitmap(bitmap,0,0,null);//在画布上绘制bitmap(这张画布是在bm上的,所以实际是在bm上绘制bitmap)

/** canvas.drawBitmap(Bitmap source,float left,float top,Paint paint)
*@param Bitmap source ,源文件
*@param float left,从距离左边left开始绘制
*@param float top,从距离上面top绘制
*@param Paint paint,使用的画笔
*@return
**/


2.使用Matrix 来配合canvas完成缩放

//同样根据view大小创建bitmap
Bitmap bm=Bitmap.create(width,height,Bitmap.Config.ARGB_8888);
Canvas canvas= new Canvas(bm);
Matrix matrix=new Matrix();
matrix.setScale(scaleW,scaleH);
canvas.drawBitmap(bitmap,matrix,null);//使用matrix完成了缩放

/** canvas.drawBitmap(Bitmap source,Matrix matrix,Paint paint)
*@param Bitmap source ,源文件
*@param Matrix matrix,变换矩阵3*3,可以完成一系列变换,不只是缩放
*@param Paint paint,使用的画笔
*@return
**/


3.不使用Canvas,直接通过Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

Matrix matrix=new Matrix();
matrix.setScale(scaleW,scaleH);
Bitmap bm=Bitmap.createBitmap(bitmap, 0, 0, srcW,srcH, matrix, true );//这种方法好像是最简单的,不需要
//Canvas的辅助,最终生成的bitmap大小也是动态的

/** createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
*@param Bitmap source ,源文件
*@param int x,从源图像水平方向x选取图像开始绘制到目标图像
*@param int  y,从源图像竖直方向y选取图像开始绘制到目标图像
*@param int  width,注意,要画源图像从x开始多宽的图像
*@param int height ,注意,要画源图像从y开始多高的图像
*@param Matrix matrix,变换的矩阵
*@param bolean filter,当进行的不只是平移变换时,filter参数为true可以进行滤波处理,有助于改善新图像质量;flase时,计算机不做过滤处理
*@return
**/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: