首页 > 移动开发 > android 图片的 放大 缩小 移动

android 图片的 放大 缩小 移动

全是以前的 一些例子,也是学习别人的。拿出来和大家分享,经常用到的功能

 

 

所有代码了。

 

[java] 
  1. public class MainActivity extends Activity {
  2.     private ImageView imageView;
  3.     @Override
  4.     public void onCreate(Bundle savedInstanceState) {
  5.           super.onCreate(savedInstanceState);
  6.             setContentView(R.layout.activity_main);
  7.             imageView = (ImageView) findViewById(R.id.imageView);
  8.             imageView.setOnTouchListener(new OnTouchListener() {
  9.             // 设置开始点
  10.             private PointF startPoint = new PointF();
  11.             // 设置图片位置的变换矩阵
  12.             private Matrix matrix = new Matrix();
  13.             // 设置图片当前位置的变换矩阵
  14.             private Matrix currentMatrix = new Matrix();
  15.             // 初始化模式参数
  16.             private int mode = 0;
  17.             // 无模式
  18.             private static final int NONE = 0;
  19.             // 拖拉模式
  20.             private static final int DRAG = 1;
  21.             // 缩放模式
  22.             private static final int ZOOM = 2;
  23.             // 开启缩放效果的门槛
  24.             private static final float ZOOM_THRESHOLD = 10.0f;
  25.             // 开始距离
  26.             private float startDistance;
  27.             // 中心点
  28.             private PointF middlePoint;
  29.             @Override
  30.             public boolean onTouch(View v, MotionEvent event) {
  31.                 switch (event.getAction() & MotionEvent.ACTION_MASK) {
  32.                 case MotionEvent.ACTION_DOWN:
  33.                     mode = DRAG;
  34.                     // 记录图片当前的移动位置
  35.                     currentMatrix.set(imageView.getImageMatrix());
  36.                     // 记录开始坐标
  37.                     startPoint.set(event.getX(), event.getY());
  38.                     break;
  39.                  // 当屏幕上已经有触点(手指),再有手指按下时触发该事件
  40.                 case MotionEvent.ACTION_POINTER_DOWN:
  41.                     mode = ZOOM;
  42.                     //得到两点间的距离
  43.                     startDistance = getDistance(event);
  44.                     //如果大于
  45.                     if(startDistance > ZOOM_THRESHOLD) {
  46.                         //得到两点的中间点
  47.                         middlePoint = getMiddlePoint(event);
  48.                         // 记录图片当前的缩放比例
  49.                         currentMatrix.set(imageView.getImageMatrix());
  50.                     }
  51.                     break;
  52.                 case MotionEvent.ACTION_MOVE:
  53.                     if(mode == DRAG) {
  54.                         // 获取X轴移动距离
  55.                         float distanceX = event.getX() - startPoint.x;
  56.                         // 获取Y轴移动距离
  57.                         float distanceY = event.getY() - startPoint.y;
  58.                         // 在上次移动停止位置的基础上再进行移动
  59.                         matrix.set(currentMatrix);
  60.                         // 实现图片位置移动
  61.                         matrix.postTranslate(distanceX, distanceY);
  62.                      }else if(mode == ZOOM) {
  63.                         // 结束距离
  64.                         float endDistance = getDistance(event);
  65.                         if(endDistance > ZOOM_THRESHOLD) {
  66.                             // 缩放比例
  67.                             float scale = endDistance / startDistance;
  68.                             matrix.set(currentMatrix);
  69.                             matrix.postScale(scale, scale, middlePoint.x, middlePoint.y);
  70.                         }
  71.                     }
  72.                     break;
  73.                 case MotionEvent.ACTION_UP:
  74.                 // 当手指离开屏幕,但屏幕上仍有其他触点(手指)时触发该事件
  75.                 case MotionEvent.ACTION_POINTER_UP:
  76.                     mode = 0;
  77.                     break;
  78.                 }
  79.                 imageView.setImageMatrix(matrix);
  80.                 return true;
  81.             }
  82.         });
  83.     }
  84.         /**
  85.          * 计算两点之间的距离
  86.          */
  87.         public static float getDistance(MotionEvent event) {
  88.             //第二个点x、y坐标减去第一个点x、y坐标
  89.             float disX = event.getX(1) - event.getX(0);
  90.             float disY = event.getY(1) - event.getY(0);
  91.             return FloatMath.sqrt(disX * disX + disY * disY);
  92.         }
  93.         /**
  94.          * 计算两点之间的中间点
  95.          */
  96.         public static PointF getMiddlePoint(MotionEvent event) {
  97.             float midX = (event.getX(0) + event.getX(1)) /2;
  98.             float midY = (event.getY(0) + event.getY(1)) /2;
  99.             return new PointF(midX, midY);
  100.         }
  101. }

本文固定链接: http://www.devba.com/index.php/archives/4674.html | 开发吧

报歉!评论已关闭.