IT在线教育平台——麦子学院http://www.maiziedu.com本文章来给各位同学介绍一下Android开发之ImageView通过matrix实现手势缩放操作方法,我们知道安卓中ImageView本身有scaleType属性,通过设置android:scaleType=matrix可以用很少的代码就实现缩放功能了,下面我们来看看。关于ImageView的手势缩放,有很多种方法,绝大多数开源自定义缩放都是修改了ondraw函数来实现的。但是ImageView本身有scaleType属性,通过设置android:scaleType="matrix"可以用很少的代码就实现缩放功能。缩放的优点是实现起来简单,同时因为没有反复调用ondraw函数,缩放过程中不会有闪烁现象。MATRIX矩阵可以动态缩小放大图片来显示,缩小图片:代码如下//获得Bitmap的高和宽intbmpWidth=bmp.getWidth();intbmpHeight=bmp.getHeight();//设置缩小比例doublescale=0.8;//计算出这次要缩小的比例scaleWidth=(float)(scaleWidth*scale);scaleHeight=(float)(scaleHeight*scale);//产生resize后的Bitmap对象Matrixmatrix=newMatrix();matrix.postScale(scaleWidth,scaleHeight);BitmapresizeBmp=Bitmap.createBitmap(bmp,0,0,bmpWidth,bmpHeight,matrix,true);下面将一个自定义的实现了手势缩放的ImageView代码拷贝如下:代码如下packagecom.jcodecraeer.stargallerry;importandroid.content.Context;importandroid.graphics.Matrix;importandroid.graphics.PointF;importandroid.util.AttributeSet;importandroid.util.FloatMath;IT在线教育平台——麦子学院http://www.maiziedu.comimportandroid.view.MotionEvent;importandroid.widget.ImageView;publicclassImageTouchViewextendsImageView{privatePointFstartPoint=newPointF();privateMatrixmatrix=newMatrix();privateMatrixcurrentMaritx=newMatrix();privateintmode=0;//用于标记模式privatestaticfinalintDRAG=1;//拖动privatestaticfinalintZOOM=2;//放大privatefloatstartDis=0;privatePointFmidPoint;//中心点/***默认构造函数*@paramcontext*/publicImageTouchView(Contextcontext){super(context);}/***该构造方法在静态引入XML文件中是必须的*@paramcontext*@paramparamAttributeSet*/publicImageTouchView(Contextcontext,AttributeSetparamAttributeSet){super(context,paramAttributeSet);}IT在线教育平台——麦子学院http://www.maiziedu.compublicbooleanonTouchEvent(MotionEventevent){startPoint.set(www.maiziedu.com).ACTIONDOWNswitch(event.getAction()&MotionEvent.ACTION_MASK){caseMotionEvent.ACTION_DOWN:mode=DRAG;currentMaritx.set(this.getImageMatrix());//记录ImageView当期的移动位置startPoint.set(event.getX(),event.getY());//开始点break;caseMotionEvent.ACTION_MOVE://移动事件if(mode==DRAG){//图片拖动事件floatdx=event.getX()-startPoint.x;//x轴移动距离floatdy=event.getY()-startPoint.y;matrix.set(currentMaritx);//在当前的位置基础上移动matrix.postTranslate(dx,dy);}elseif(mode==ZOOM){//图片放大事件floatendDis=distance(event);//结束距离if(endDis>10f){floatscale=endDis/startDis;//放大倍数//Log.v("scale=",String.valueOf(scale));matrix.set(currentMaritx);matrix.postScale(scale,scale,midPoint.x,midPoint.y);}}break;IT在线教育平台——麦子学院http://www.maiziedu.comcaseMotionEvent.ACTION_UP:mode=0;break;//有手指离开屏幕,但屏幕还有触点(手指)caseMotionEvent.ACTION_POINTER_UP:mode=0;break;//当屏幕上已经有触点(手指),再有一个手指压下屏幕caseMotionEvent.ACTION_POINTER_DOWN:mode=ZOOM;startDis=distance(event);if(startDis>10f){//避免手指上有两个茧midPoint=mid(event);currentMaritx.set(this.getImageMatrix());//记录当前的缩放倍数}break;}this.setImageMatrix(matrix);returntrue;}/***两点之间的距离*@paramevent*@return*/privatestaticfloatdistance(MotionEventevent){//两根线的距离IT在线教育平台——麦子学院http://www.maiziedu.comfloatd...