Android手势控制实现缩放、移动图片
本文实例为大家分享了Android手势控制实现缩放、移动图片的方法,供大家参考,具体内容如下
新建一个触摸监听器类
packagecom.liyong.btprinter;
importandroid.graphics.Matrix;
importandroid.graphics.PointF;
importandroid.util.FloatMath;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.View.OnTouchListener;
importandroid.widget.ImageView;
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);
}
}
编写一个xml文件
<?xmlversion="1.0"encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/linearLayout1" android:weightSum="1"> <ImageViewandroid:layout_width="fill_parent" android:id="@+id/priviewimage" android:layout_height="fill_parent" android:layout_gravity="center" android:scaleType="matrix" > </ImageView> </LinearLayout>
注意其中的:android:scaleType="matrix"
priviewimage.setImageBitmap(ActivityPreviewImage.click_bitmap); priviewimage=(ImageView)findViewById(R.id.priviewimage); priviewimage.setOnTouchListener(newMulitPointTouchListener());
以上就是Android手势控制缩放移动图片的全部代码,希望对大家的学习有所帮助。