手指多点触控事件
2015-05-29 13:42
357 查看
package com.itheima.touch; 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 MainActivity extends Activity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.imageView); imageView.setOnTouchListener(new MyOnTouchListener()); // 添加触摸监听器 } private class MyOnTouchListener implements OnTouchListener { private float x; // 图片移动前的x轴坐标 private float y; // 图片移动前的y轴坐标 private Matrix newMatrix = new Matrix(); // 用来移动图片的矩阵 private Matrix oldMatrix = new Matrix(); // 图片移动前的矩阵 private int type; // 操作类型, 一根手指触摸还是两根手指触摸 private float start; // 第二根手指按下时的距离 private float end; // 两根手指移动后的距离 private PointF point; // 放大时的中心点 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: type = 1; x = event.getX(); y = event.getY(); oldMatrix.set(imageView.getImageMatrix()); break; case MotionEvent.ACTION_POINTER_DOWN: type = 2; start = countDistance(event); // 计算第二根手指按下时两点之间的距离 point = countPoint(event); // 计算中心点 oldMatrix.set(imageView.getImageMatrix()); break; case MotionEvent.ACTION_MOVE: newMatrix.set(oldMatrix); if (type == 1) { // 1根手指触摸 newMatrix.postTranslate(event.getX() - x, event.getY() - y); } else { // 2跟手指触摸 end = countDistance(event); // 计算结束时距离 float scale = end / start; // 计算缩放比例 newMatrix.postScale(scale, scale, point.x, point.y); // 对模型进行缩放 } break; } imageView.setImageMatrix(newMatrix); // 改变图片 return true; } } public float countDistance(MotionEvent event) { float a = event.getX(1) - event.getX(0); // x轴距离 float b = event.getY(1) - event.getY(0); // y轴距离 return (float) Math.sqrt(a * a + b * b); // 勾股定理 } public PointF countPoint(MotionEvent event) { float x = (event.getX(0) + event.getX(1)) / 2; // x轴中间点 float y = (event.getY(0) + event.getY(1)) / 2; // y轴中间点 return new PointF(x, y); } /* private class MyOnTouchListener implements OnTouchListener { private float x; private float y; private Matrix oldMatrix = new Matrix(); private Matrix newMatrix = new Matrix(); // 用来操作图片的模型 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { // 判断触摸动作的类型 case MotionEvent.ACTION_DOWN: // 按下时 x = event.getX(); // 获取x轴坐标 y = event.getY(); // 获取y轴坐标 oldMatrix.set(imageView.getImageMatrix()); // 用模型记住图片所在位置 break; case MotionEvent.ACTION_MOVE: // 移动时 newMatrix.set(oldMatrix); // 用另一个模型记住按下时的位置 newMatrix.postTranslate(event.getX() - x, event.getY() - y); // 移动模型 break; } imageView.setImageMatrix(newMatrix); // 把图片放到了移动后的模型中 return true; } } */ }
相关文章推荐
- 基于PHP的crontab定时任务管理
- 机顶盒高级安全
- netstat 的10个基本用法
- 一---Android-SDK系列文章(3) ---java(自己动手编译、运行Java程序)
- MatLab自编的均值滤波、中值滤波、高斯滤波三种滤波算子,可以直接调用 图像处理函数
- FTP上传下载文件
- ios7 indexPathForCell 的坑(真是一个大大的坑)
- IIS7中出现,未能加载文件或程序集“XXX.XXX”或它的某一个依赖项。
- 自制图标
- NBUT 1116 Flandre's Passageway (LIS变形)
- Bacula的资料
- 第12周项目4-点和圆的关系(3)
- hibernate一对多
- kafka消息demo的java实现
- 使用DOS工具修复数据库发生的异常
- 80端口被system占用
- SharePoint 2013 隐藏左边快速启动菜单栏(Hiding the Quick Launch Bar)
- PHP、Java、.Net和Javascript的AES加密解密实现
- XenDesktop7.6安装部署入门教程
- Gleanings of Python