• 手指多点触控事件


      1 package com.itheima.touch;
      2 
      3 import android.app.Activity;
      4 import android.graphics.Matrix;
      5 import android.graphics.PointF;
      6 import android.os.Bundle;
      7 import android.view.MotionEvent;
      8 import android.view.View;
      9 import android.view.View.OnTouchListener;
     10 import android.widget.ImageView;
     11 
     12 public class MainActivity extends Activity {
     13 
     14     private ImageView imageView;
     15 
     16     @Override
     17     protected void onCreate(Bundle savedInstanceState) {
     18         super.onCreate(savedInstanceState);
     19         setContentView(R.layout.activity_main);
     20         
     21         imageView = (ImageView) findViewById(R.id.imageView);
     22         imageView.setOnTouchListener(new MyOnTouchListener());        // 添加触摸监听器
     23     }
     24     
     25     private class MyOnTouchListener implements OnTouchListener {
     26         private float x;        // 图片移动前的x轴坐标
     27         private float y;        // 图片移动前的y轴坐标
     28         private Matrix newMatrix = new Matrix();         // 用来移动图片的矩阵
     29         private Matrix oldMatrix = new Matrix();        // 图片移动前的矩阵
     30         private int type;        // 操作类型, 一根手指触摸还是两根手指触摸
     31         private float start;    // 第二根手指按下时的距离
     32         private float end;        // 两根手指移动后的距离
     33         private PointF point;    // 放大时的中心点
     34 
     35         public boolean onTouch(View v, MotionEvent event) {
     36             switch (event.getAction() & MotionEvent.ACTION_MASK) {  
     37                 case MotionEvent.ACTION_DOWN:
     38                     type = 1;
     39                     x = event.getX();
     40                     y = event.getY();
     41                     oldMatrix.set(imageView.getImageMatrix());
     42                     break;
     43                 case MotionEvent.ACTION_POINTER_DOWN:
     44                     type = 2;
     45                     start = countDistance(event);         // 计算第二根手指按下时两点之间的距离
     46                     point = countPoint(event);             // 计算中心点
     47                     oldMatrix.set(imageView.getImageMatrix());
     48                     break;
     49                 case MotionEvent.ACTION_MOVE:
     50                     newMatrix.set(oldMatrix);
     51                     if (type == 1) {     // 1根手指触摸
     52                         newMatrix.postTranslate(event.getX() - x, event.getY() - y);
     53                     } else {             // 2跟手指触摸
     54                         end = countDistance(event);     // 计算结束时距离
     55                         float scale = end / start;         // 计算缩放比例
     56                         newMatrix.postScale(scale, scale, point.x, point.y);     // 对模型进行缩放
     57                     }
     58                     break;
     59             }
     60             imageView.setImageMatrix(newMatrix);     // 改变图片
     61             return true;
     62         }
     63     }
     64 
     65     public float countDistance(MotionEvent event) {
     66         float a = event.getX(1) - event.getX(0);     // x轴距离
     67         float b = event.getY(1) - event.getY(0);     // y轴距离
     68         return (float) Math.sqrt(a * a + b * b);     // 勾股定理
     69     }
     70 
     71     public PointF countPoint(MotionEvent event) {
     72         float x = (event.getX(0) + event.getX(1)) / 2;     // x轴中间点
     73         float y = (event.getY(0) + event.getY(1)) / 2;     // y轴中间点
     74         return new PointF(x, y);
     75     }
     76 
     77     
     78     /*
     79     private class MyOnTouchListener implements OnTouchListener {
     80         private float x;
     81         private float y;
     82         private Matrix oldMatrix = new Matrix();
     83         private Matrix newMatrix = new Matrix();        // 用来操作图片的模型
     84 
     85         public boolean onTouch(View v, MotionEvent event) {
     86             switch (event.getAction()) {                // 判断触摸动作的类型
     87                 case MotionEvent.ACTION_DOWN:             // 按下时
     88                     x = event.getX();                     // 获取x轴坐标
     89                     y = event.getY();                    // 获取y轴坐标
     90                     oldMatrix.set(imageView.getImageMatrix());        // 用模型记住图片所在位置
     91                     break;
     92                 case MotionEvent.ACTION_MOVE:             // 移动时
     93                     newMatrix.set(oldMatrix);             // 用另一个模型记住按下时的位置
     94                     newMatrix.postTranslate(event.getX() - x, event.getY() - y);    // 移动模型
     95                     break;
     96             }
     97             imageView.setImageMatrix(newMatrix);        // 把图片放到了移动后的模型中
     98             return true;
     99         }
    100     }
    101     */
    102     
    103 }
  • 相关阅读:
    UVaLive 3695 Distant Galaxy (扫描线)
    UVaLive 3695 City Game (扫描线)
    CodeForces 349B Color the Fence (DP)
    UVaLive 3905 Meteor (扫描线)
    UVaLive 3902 Network (无根树转有根树,贪心)
    NodeJS学习笔记 (16)子进程-child_process(ok)
    字符编码笔记:ASCII,Unicode 和 UTF-8
    NodeJS学习笔记 (15)二进制数据-buffer(ok)
    NodeJS学习笔记 (14)URL查询字符串-querystring(ok)
    NodeJS学习笔记 (13)数据加密-crypto(OK)
  • 原文地址:https://www.cnblogs.com/friends-wf/p/4538318.html
Copyright © 2020-2023  润新知