范例说明
手机的功能越来越强大,相机功能俨然成为目前手机的标准配备,浏览相片也成为手机必备的功能,能够在浏览相片的同时,对相片作放大缩小的查看,也是一项基本的要求。
本范例将运用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对象,除了可以用来作图片的缩放外,还有非常实用的旋转效果,我们将会在后面的范例中示范。