android中图片的拖拉和缩放
16lz
2021-12-04
首先是布局文件,引入图片
activity
package cn.wonders.drag;import android.support.v7.app.ActionBarActivity;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;import android.graphics.Matrix;import android.graphics.PointF;import android.os.Bundle;public class MainActivity extends ActionBarActivity {private ImageView imageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) findViewById(R.id.imageView);imageView.setOnTouchListener(new TonchListener());}private final class TonchListener implements OnTouchListener {private PointF startPoint = new PointF();private Matrix matrix = new Matrix();//照片当前的移动位子private Matrix currentMatrix = new Matrix();//模式private int mode = 0;//拖拉private final static int GRAG = 1;//多点触摸private final static int ZOOM = 2;//开始时2根手指的距离private float startDis;//中间点private PointF midPoint;@Overridepublic boolean onTouch(View v, MotionEvent event) {//取后8位switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN://第一次按下时记录坐标mode = GRAG;currentMatrix.set(imageView.getImageMatrix());startPoint.set(event.getX(), event.getY());break;case MotionEvent.ACTION_MOVE:if(mode == GRAG) {float dx = event.getX() - startPoint.x;float dy = event.getY() - startPoint.y;//实现位子的移动,在上一次的基础上移动matrix.set(currentMatrix);matrix.postTranslate(dx, dy);}else if (mode == ZOOM) {//缩放float endDis = distance(event);//得到缩放倍数if(endDis > 10f) {float scale = endDis/startDis;//参数:x和y轴的放大倍数,以及中心点matrix.postScale(scale, scale, midPoint.x, midPoint.y);}}break;case MotionEvent.ACTION_UP:break;//在此前已经有手指按下,屏幕上至少有2根手指case MotionEvent.ACTION_POINTER_DOWN:mode = ZOOM;startDis = distance(event);//距离大于10个像素才处理,防止有手指分叉或有茧;if(startDis > 10f) {midPoint = mid(event);//记录当前的放大倍数currentMatrix.set(imageView.getImageMatrix());}break;case MotionEvent.ACTION_POINTER_UP:mode = 0;break;default:break;} imageView.setImageMatrix(matrix);//消费掉事件return true;}}//返回2个手指间的距离private static float distance(MotionEvent event) {float dx = event.getX(1) - event.getX(0);float dy = event.getY(1) - event.getY(0);return (float) Math.sqrt(dx*dx+dy*dy);}//计算中心点,为2根手指的中心点private static PointF mid(MotionEvent event) {float dx = event.getX(1) + event.getX(0);float dy = event.getY(1) + event.getY(0);return new PointF(dx/2, dy/2);}}
更多相关文章
- android 多点触摸绘画demo
- Android(安卓)利用adb命令 使App自动点击屏幕指定位置
- android 自定义组件随着手指自动画圆
- Android中view的简单应用---随手指移动的小球
- android 自定义动画1
- Android(安卓)BackgroundViewPager:类似桌面背景壁纸随手指滑动
- Android手机手势示例
- Android(安卓)自定义Gallery
- Android放大镜的实现