图片拖动和缩放功能
在图片拖动的基础上增加
package com.xiawenquan; import android.app.Activity; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { /** Called when the activity is first created. */ private ImageView imageView; private PointF startPoint = null; private Matrix matrix = null; private Matrix currMatrix ; private int drug = 5; private int zoom = 10; private int type = 0; private float startDistance; private PointF midPointF; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startPoint = new PointF(); matrix = new Matrix(); // 用于拖拉变换 currMatrix = new Matrix(); // 用于拖拉变换 imageView = (ImageView) findViewById(R.id.imageView); imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN://只有一个手指按下屏幕时触发的事件 currMatrix.set(matrix); // 保存上一次的移动点 startPoint.set(event.getX(),event.getY());//移动前,手指按下的位置 type = drug; // 只有一个手指按下屏幕时属于拖拉 break; case MotionEvent.ACTION_MOVE://手指在屏幕移动时触发的事件,该事件在移动过程不断被触发 if(type == drug){ float mX = event.getX() - startPoint.x; // 移动点的X坐标 float mY = event.getY() - startPoint.y;// 移动点的Y坐标 matrix.set(currMatrix); // 保存当前变换的点 matrix.postTranslate(mX, mY); // 移动到指定的点 }else if(type == zoom){ float distance = distance(event); if(distance > 5f){ matrix.set(currMatrix); //在上次缩放结果的基本上进行缩放 float cale = distance / startDistance; // 获取距离的倍数 matrix.preScale(cale, cale, midPointF.x, midPointF.y); // 前面2个参数是X,Y坐标缩放,后面的参考点的X,Y坐标 } } break; case MotionEvent.ACTION_POINTER_DOWN://如果已经有一个手指按下屏幕,后续再有手指按下屏幕,就会触发这个事件 startDistance = distance(event); // 保存2个手指的距离 if(startDistance > 5f){ // 2个手指的最小距离是5个像素 type = zoom; currMatrix.set(matrix); // 保存第一次缩放后的位置,用于2次以后的缩放(//保存当前的缩放结果) midPointF = getMidPoinF(event); } break; case MotionEvent.ACTION_UP://最后一个手指离开屏幕后触发的事件 break; case MotionEvent.ACTION_POINTER_UP://有一个手指离开了屏幕,但还有手指在屏幕上,此时会触发该事件 type = 0; // 当离开屏幕的时候还原。 break; default: break; } imageView.setImageMatrix(matrix); // imageView在移动 return true; } }); } // 求两点的距离 private float distance(MotionEvent event){ float eX = event.getX(1) - event.getX(0); // 后一个点减去前一个点 float eY = event.getY(1) - event.getY(0); return FloatMath.sqrt(eX * eX + eY * eY); } // 求2点的中心点 private PointF getMidPoinF(MotionEvent event){ float x = (event.getX(1) + event.getX(0)) / 2; float y = (event.getY(1) + event.getY(0)) / 2; return new PointF(x, y); } }
相关推荐
huha 2020-10-16
xfcyhades 2020-11-20
sgafdsg 2020-11-04
Michael 2020-11-03
fengyeezju 2020-10-14
ziyexiaoxiao 2020-10-14
业余架构师 2020-10-09
OuNuo0 2020-09-29
moses 2020-09-22
Angelia 2020-09-11
qinxu 2020-09-10
刘炳昭 2020-09-10
Nostalgiachild 2020-09-07
Nostalgiachild 2020-08-17
leavesC 2020-08-14
一青年 2020-08-13
AndroidAiStudy 2020-08-07
ydc0 2020-07-30
绿豆饼 2020-07-28