Android手势滑动实现ImageView缩放图片大小
本文推出了两种Android手势实现ImageView缩放图片大小的方法,分享给大家供大家参考,具体内容如下
方法一:
将以下代码写到MulitPointTouchListener.java中,然后对你相应的图片进行OnTouchListener。
例如:imageView.setOnTouchListener(newMulitPointTouchListener());
在xml中要将ImageView的缩放格式改成Matrix
例如:android:scaleType="matrix"
这样就可以实现图片的缩放了
下面是MulitPointTouchListener.java代码:
publicclassMulitPointTouchListenerimplementsOnTouchListener{ privatestaticfinalStringTAG="Touch"; //Thesematriceswillbeusedtomoveandzoomimage Matrixmatrix=newMatrix(); MatrixsavedMatrix=newMatrix(); //Wecanbeinoneofthese3states staticfinalintNONE=0; staticfinalintDRAG=1; staticfinalintZOOM=2; intmode=NONE; //Remembersomethingsforzooming PointFstart=newPointF(); PointFmid=newPointF(); floatoldDist=1f; @Override publicbooleanonTouch(Viewv,MotionEventevent){ ImageViewview=(ImageView)v; //Log.e("view_width", //view.getImageMatrix()..toString()+"*"+v.getWidth()); //Dumptoucheventtolog dumpEvent(event); //Handletoucheventshere... switch(event.getAction()&MotionEvent.ACTION_MASK){ caseMotionEvent.ACTION_DOWN: matrix.set(view.getImageMatrix()); savedMatrix.set(matrix); start.set(event.getX(),event.getY()); //Log.d(TAG,"mode=DRAG"); mode=DRAG; //Log.d(TAG,"mode=NONE"); break; caseMotionEvent.ACTION_POINTER_DOWN: oldDist=spacing(event); //Log.d(TAG,"oldDist="+oldDist); if(oldDist>10f){ savedMatrix.set(matrix); midPoint(mid,event); mode=ZOOM; //Log.d(TAG,"mode=ZOOM"); } break; caseMotionEvent.ACTION_UP: caseMotionEvent.ACTION_POINTER_UP: mode=NONE; //Log.e("view.getWidth",view.getWidth()+""); //Log.e("view.getHeight",view.getHeight()+""); break; caseMotionEvent.ACTION_MOVE: if(mode==DRAG){ //... matrix.set(savedMatrix); matrix.postTranslate(event.getX()-start.x,event.getY() -start.y); }elseif(mode==ZOOM){ floatnewDist=spacing(event); //Log.d(TAG,"newDist="+newDist); if(newDist>10f){ matrix.set(savedMatrix); floatscale=newDist/oldDist; matrix.postScale(scale,scale,mid.x,mid.y); } } break; } view.setImageMatrix(matrix); returntrue;//indicateeventwashandled } privatevoiddumpEvent(MotionEventevent){ Stringnames[]={"DOWN","UP","MOVE","CANCEL","OUTSIDE", "POINTER_DOWN","POINTER_UP","7?","8?","9?"}; StringBuildersb=newStringBuilder(); intaction=event.getAction(); intactionCode=action&MotionEvent.ACTION_MASK; sb.append("eventACTION_").append(names[actionCode]); if(actionCode==MotionEvent.ACTION_POINTER_DOWN ||actionCode==MotionEvent.ACTION_POINTER_UP){ sb.append("(pid").append( action>>MotionEvent.ACTION_POINTER_ID_SHIFT); sb.append(")"); } sb.append("["); for(inti=0;i<event.getPointerCount();i++){ sb.append("#").append(i); sb.append("(pid").append(event.getPointerId(i)); sb.append(")=").append((int)event.getX(i)); sb.append(",").append((int)event.getY(i)); if(i+1<event.getPointerCount()) sb.append(";"); } sb.append("]"); //Log.d(TAG,sb.toString()); } privatefloatspacing(MotionEventevent){ floatx=event.getX(0)-event.getX(1); floaty=event.getY(0)-event.getY(1); returnFloatMath.sqrt(x*x+y*y); } privatevoidmidPoint(PointFpoint,MotionEventevent){ floatx=event.getX(0)+event.getX(1); floaty=event.getY(0)+event.getY(1); point.set(x/2,y/2); } }
方法二:自定义一个ImageView,例如TouchImageView:
importandroid.content.Context; importandroid.graphics.Matrix; importandroid.graphics.PointF; importandroid.graphics.drawable.Drawable; importandroid.util.AttributeSet; importandroid.util.Log; importandroid.view.MotionEvent; importandroid.view.ScaleGestureDetector; importandroid.view.View; importandroid.widget.ImageView; publicclassTouchImageViewextendsImageView{ Matrixmatrix; //Wecanbeinoneofthese3states staticfinalintNONE=0; staticfinalintDRAG=1; staticfinalintZOOM=2; intmode=NONE; //Remembersomethingsforzooming PointFlast=newPointF(); PointFstart=newPointF(); floatminScale=1f; floatmaxScale=3f; float[]m; intviewWidth,viewHeight; staticfinalintCLICK=3; floatsaveScale=1f; protectedfloatorigWidth,origHeight; intoldMeasuredWidth,oldMeasuredHeight; ScaleGestureDetectormScaleDetector; Contextcontext; publicTouchImageView(Contextcontext){ super(context); sharedConstructing(context); } publicTouchImageView(Contextcontext,AttributeSetattrs){ super(context,attrs); sharedConstructing(context); } privatevoidsharedConstructing(Contextcontext){ super.setClickable(true); this.context=context; mScaleDetector=newScaleGestureDetector(context,newScaleListener()); matrix=newMatrix(); m=newfloat[9]; setImageMatrix(matrix); setScaleType(ScaleType.MATRIX); setOnTouchListener(newOnTouchListener(){ @Override publicbooleanonTouch(Viewv,MotionEventevent){ mScaleDetector.onTouchEvent(event); PointFcurr=newPointF(event.getX(),event.getY()); switch(event.getAction()){ caseMotionEvent.ACTION_DOWN: last.set(curr); start.set(last); mode=DRAG; break; caseMotionEvent.ACTION_MOVE: if(mode==DRAG){ floatdeltaX=curr.x-last.x; floatdeltaY=curr.y-last.y; floatfixTransX=getFixDragTrans(deltaX,viewWidth,origWidth*saveScale); floatfixTransY=getFixDragTrans(deltaY,viewHeight,origHeight*saveScale); matrix.postTranslate(fixTransX,fixTransY); fixTrans(); last.set(curr.x,curr.y); } break; caseMotionEvent.ACTION_UP: mode=NONE; intxDiff=(int)Math.abs(curr.x-start.x); intyDiff=(int)Math.abs(curr.y-start.y); if(xDiff<CLICK&&yDiff<CLICK) performClick(); break; caseMotionEvent.ACTION_POINTER_UP: mode=NONE; break; } setImageMatrix(matrix); invalidate(); returntrue;//indicateeventwashandled } }); } publicvoidsetMaxZoom(floatx){ maxScale=x; } privateclassScaleListenerextendsScaleGestureDetector.SimpleOnScaleGestureListener{ @Override publicbooleanonScaleBegin(ScaleGestureDetectordetector){ mode=ZOOM; returntrue; } @Override publicbooleanonScale(ScaleGestureDetectordetector){ floatmScaleFactor=detector.getScaleFactor(); floatorigScale=saveScale; saveScale*=mScaleFactor; if(saveScale>maxScale){ saveScale=maxScale; mScaleFactor=maxScale/origScale; }elseif(saveScale<minScale){ saveScale=minScale; mScaleFactor=minScale/origScale; } if(origWidth*saveScale<=viewWidth||origHeight*saveScale<=viewHeight) matrix.postScale(mScaleFactor,mScaleFactor,viewWidth/2,viewHeight/2); else matrix.postScale(mScaleFactor,mScaleFactor,detector.getFocusX(),detector.getFocusY()); fixTrans(); returntrue; } } voidfixTrans(){ matrix.getValues(m); floattransX=m[Matrix.MTRANS_X]; floattransY=m[Matrix.MTRANS_Y]; floatfixTransX=getFixTrans(transX,viewWidth,origWidth*saveScale); floatfixTransY=getFixTrans(transY,viewHeight,origHeight*saveScale); if(fixTransX!=0||fixTransY!=0) matrix.postTranslate(fixTransX,fixTransY); } floatgetFixTrans(floattrans,floatviewSize,floatcontentSize){ floatminTrans,maxTrans; if(contentSize<=viewSize){ minTrans=0; maxTrans=viewSize-contentSize; }else{ minTrans=viewSize-contentSize; maxTrans=0; } if(trans<minTrans) return-trans+minTrans; if(trans>maxTrans) return-trans+maxTrans; return0; } floatgetFixDragTrans(floatdelta,floatviewSize,floatcontentSize){ if(contentSize<=viewSize){ return0; } returndelta; } @Override protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){ super.onMeasure(widthMeasureSpec,heightMeasureSpec); viewWidth=MeasureSpec.getSize(widthMeasureSpec); viewHeight=MeasureSpec.getSize(heightMeasureSpec); // //Rescalesimageonrotation // if(oldMeasuredHeight==viewWidth&&oldMeasuredHeight==viewHeight ||viewWidth==0||viewHeight==0) return; oldMeasuredHeight=viewHeight; oldMeasuredWidth=viewWidth; if(saveScale==1){ //Fittoscreen. floatscale; Drawabledrawable=getDrawable(); if(drawable==null||drawable.getIntrinsicWidth()==0||drawable.getIntrinsicHeight()==0) return; intbmWidth=drawable.getIntrinsicWidth(); intbmHeight=drawable.getIntrinsicHeight(); Log.d("bmSize","bmWidth:"+bmWidth+"bmHeight:"+bmHeight); floatscaleX=(float)viewWidth/(float)bmWidth; floatscaleY=(float)viewHeight/(float)bmHeight; scale=Math.min(scaleX,scaleY); matrix.setScale(scale,scale); //Centertheimage floatredundantYSpace=(float)viewHeight-(scale*(float)bmHeight); floatredundantXSpace=(float)viewWidth-(scale*(float)bmWidth); redundantYSpace/=(float)2; redundantXSpace/=(float)2; matrix.postTranslate(redundantXSpace,redundantYSpace); origWidth=viewWidth-2*redundantXSpace; origHeight=viewHeight-2*redundantYSpace; setImageMatrix(matrix); } fixTrans(); } }
然后在我们的Activity中就可以直接使用了:
publicclassTouchImageViewActivityextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); TouchImageViewimg=(TouchImageView)findViewById(R.id.snoop); img.setImageResource(R.drawable.snoopy); img.setMaxZoom(4f); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。