多点触控实现图面的放大与缩小

package com.example.zzzz;

import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class TouchActivity extends Activity {
   
 private static final int NONE = 0;
 private static final int MOVE = 1;
 private static final int ZOOM = 2;
 private static final int ROTATION = 1; 
 private int mode = NONE;
 private Matrix matrix = new Matrix();
 private Matrix savedMatrix = new Matrix();
 private PointF start = new PointF();
 private PointF mid = new PointF();
 private float s = 0;
 private float oldDistance;
 private int rotate = NONE;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        ImageView imageView = (ImageView)findViewById(R.id.imageView1);
        imageView.setOnTouchListener(new OnTouchListener()
        {
   @Override
   public boolean onTouch(View view, MotionEvent event) {
    ImageView imageView = (ImageView)view;
    switch (event.getAction()&MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
     savedMatrix.set(matrix);
     start.set(event.getX(), event.getY());
     mode = MOVE;
     rotate = NONE;
     break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP:
     mode = NONE;
     break;
    case MotionEvent.ACTION_POINTER_DOWN:
     oldDistance = (float)Math.sqrt((event.getX(0)-event.getX(1))*(event.getX(0)-event.getX(1))+(event.getY(0)-event.getY(1))*(event.getY(0)-event.getY(1)));
     if (oldDistance > 10f) {
      savedMatrix.set(matrix);
      mid.set((event.getX(0)+event.getX(1))/2, (event.getY(0)+event.getY(1))/2);
      mode = ZOOM;
     }
    case MotionEvent.ACTION_MOVE:
     if (mode == MOVE)
     {
      if(rotate == NONE) {
       savedMatrix.set(matrix);
       mid.set(event.getX(), event.getY());
       rotate = ROTATION;
      }
      else {
       matrix.set(savedMatrix);
       double a = Math.atan((mid.y-start.y)/(mid.x-start.x));
       double b = Math.atan((event.getY()-mid.y)/(event.getX()-mid.x));
       if ((b - a < Math.PI/2 && b - a > Math.PI / 18)||((b + Math.PI) % Math.PI - a < Math.PI/2 && (b + Math.PI) % Math.PI - a > Math.PI / 18)) {
        matrix.postScale((float)0.9, (float)0.9);
       }
       else if ((a - b < Math.PI / 2 && a - b > Math.PI / 18)||((a + Math.PI) % Math.PI - b < Math.PI/2 && (a + Math.PI) % Math.PI - b > Math.PI / 18)) {
        matrix.postScale((float)1.1, (float)1.1);
       }
       start.set(event.getX(), event.getY());
       rotate = NONE;
      }
     }
     else if(mode == ZOOM)
     {
      float newDistance;
      newDistance = (float)Math.sqrt((event.getX(0)-event.getX(1))*(event.getX(0)-event.getX(1))+(event.getY(0)-event.getY(1))*(event.getY(0)-event.getY(1)));
      if(newDistance > 10f) {
       matrix.set(savedMatrix);
       matrix.postScale(newDistance/oldDistance, newDistance/oldDistance, mid.x, mid.y);
       oldDistance = newDistance;
       savedMatrix.set(matrix);
      }
     }
     break;
    }
    imageView.setImageMatrix(matrix);
    return true;
   }
         
        });
    }
}

转载于:https://my.oschina.net/zhangjie830621/blog/108297

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值