Android 动态放大缩小ImageView里的图片

运用Matrix对象来缩放图片文件

范例说明

手机的功能越来越强大,相机功能俨然成为目前手机的标准配备,浏览相片也成为手机必备的功能,能够在浏览相片的同时,对相片作放大缩小的查看,也是一项基本的要求。

本范例将运用Martix(android.graphics.Matrix)对象的postScale()方法来实现在手机上缩放图片的功能,在实现本范例前,需先在/res/drawable/中放入一张图片。以本范例而言,图片文件路径为/res/drawable/ex04_23.png,程序会预先将图片加载到ImageView Widget中,并设计两个Button,一个有放大的功能、一个有缩小的功能,以显示图片放大缩小的效果。为了避免ImageView在放大的过程中,无止境地超过屏幕的尺寸,程序将在放大阶段控制图片的最大宽高。

运行结果

范例程序EX04_23.java

程序中的small()方法会将图片缩小为原尺寸的4/5,big()方法会将图片放大为原尺寸的1.25倍,当放大按钮的onClick事件被触发时,会运行big()方法;缩小按钮的onClick事件被触发时,则运行small()方法。

程序中以Matrix对象搭配Bitmap的createBitmap()方法来对图片进行缩放,并利用DisplayMetrics对象来取得屏幕显示大小,用以控制图片放大后的尺寸不会超过屏幕显示的区域。

 

/* import程序略 */
public class EX04_23 extends Activity
{
/* 相关变量声明 */
private ImageView mImageView;
private Button mButton01;
private Button mButton02;
private RelativeLayout layout1;
private Bitmap bmp;
private int id=0; 

private int displayWidth;
private int displayHeight;
private float scaleWidth=1; 

private float 
					scaleHeight=1; 

/** Called when the activity is first 
					created. */
@Override
public void onCreate(Bundle 
					savedInstanceState)
{
super.onCreate(savedInstanceState);
/*加载main.xml Layout */
setContentView(R.layout.main);
/* 取得屏幕分辨率大小 */
DisplayMetrics dm=new 
					DisplayMetrics();

					getWindowManager().getDefaultDisplay().getMetrics(dm);
displayWidth=dm.widthPixels; 

/* 屏幕高度须扣除下方Button高度 */
displayHeight=dm.heightPixels-80; 

/* 初始化相关变量 */
bmp=BitmapFactory.decodeResource(getResources(), 

R.drawable.ex04_23);
mImageView = 
					(ImageView)findViewById(R.id.myImageView);
layout1 = 
					(RelativeLayout)findViewById(R.id.layout1);
mButton01 = 
					(Button)findViewById(R.id.myButton1);
mButton02 = 
					(Button)findViewById(R.id.myButton2);
/* 缩小按钮onClickListener */
mButton01.setOnClickListener(new 
					Button.OnClickListener()
{
@Override
public void onClick(View v)
{
small();
}
});
/* 放大按钮onClickListener */
mButton02.setOnClickListener(new Button.OnClickListener() 

{
@Override
public void onClick(View v)
{
big();
}
});
}

/* 图片缩小的method */
private void small()
{
int bmpbmpWidth=bmp.getWidth(); 

int bmpbmpHeight=bmp.getHeight(); 

/* 设置图片缩小的比例 */
double scale=0.8; 

/* 计算出这次要缩小的比例 */
scaleWidth=(float) (scaleWidth*scale); 

scaleHeight=(float) 
					(scaleHeight*scale);
/* 产生reSize后的Bitmap对象 */
Matrix matrix =
					new Matrix();
matrix.postScale(scaleWidth, scaleHeight); 

Bitmap resizeBmp =
					Bitmap.createBitmap(bmp,0,0,bmpWidth, 


					bmpHeight,matrix,true);
if(id==0) 

{
/* 如果是第一次按,就删除原来默认的ImageView */
layout1.removeView(mImageView);
}
else
{
/* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */

					layout1.removeView((ImageView)findViewById(id));
}
/* 
					产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */
id++;
ImageView imageView 
					= new 
					ImageView(EX04_23.this);
imageView.setId(id);
imageView.setImageBitmap(resizeBmp);
layout1.addView(imageView);
setContentView(layout1);
/* 因为图片放到最大时放大按钮会disable,所以在缩小
					时把它重设为enable */
mButton02.setEnabled(true);
}
/* 图片放大的method */
private void big()
{
int bmpbmpWidth=bmp.getWidth(); 

int bmpbmpHeight=bmp.getHeight(); 

/* 设置图片放大的比例 */
double scale=1.25; 

/* 计算这次要放大的比例 */
scaleWidth=(float)(scaleWidth*scale); 

scaleHeight=(float)(scaleHeight*scale); 


/* 产生reSize后的Bitmap对象 */
Matrix matrix 
					= new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizeBmp 
					= Bitmap.createBitmap(bmp,0,0,bmpWidth, 


					bmpHeight,matrix,true);

if(id==0)
{
/* 如果是第一次按,就删除原来设置的ImageView */
layout1.removeView(mImageView);
}
else
{
/* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */
layout1.removeView((ImageView)findViewById(id));
}
/* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */
id++;
ImageView imageView =
					new 
					ImageView(EX04_23.this);
imageView.setId(id);
imageView.setImageBitmap(resizeBmp);
layout1.addView(imageView);
setContentView(layout1);

/* 如果再放大会超过屏幕大小,就把Button disable */
if(scaleWidth*scale*bmpWidth>displayWidth|| 

scaleHeight*scale*bmpHeight>displayHeight) 

{
mButton02.setEnabled(false);
}
}
}


 

因为在Android中不允许ImageView在产生后,动态修改其长度与宽度,所以为了实现图片放大、缩小的功能,使用的方式是当用户在单击放大或缩小的按钮时,除了将图片作放大或缩小的动作外,并将原来Layout中的ImageView删除,重新产生一个新的ImageView,指定图片给它后,再放入Layout里。用户看起来,就好像是同一张图片在放大或缩小。

在放大、缩小图片文件时使用的Martix对象,除了可以用来作图片的缩放外,还有非常实用的旋转效果,我们将会在后面的范例中示范。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值