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);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。