现在一般的Android手机都会使用电容触摸屏最少可以支持两点触摸,多的可能是七八个,所以基本上都会支持多点触控, android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求。 Android SDK中的MotionEvent类不仅封装了单点触摸的消息,也封装了多点触摸的消息,对于单点触摸和多点触摸的处理方式几乎是一样的。

需要注意的是:Android的多点触控功能需要运行在Android 2.0版本以上。

下面讲一个样例:Activity加载入一个图片,可以通过一个手指对图片进行拖动,也可以通过两个手指的滑动实现图片的放大缩小:

1.主要使用 API 详解:

    event.getPointerCount():触控点的个数
getPointerId(int pointerIndex):pointerIndex从0到getPointerCount-1,返回一个触摸点的标示
getX(int pointerIndex):通过标示来得到X坐标
getY(int pointerIndex):通过标示来得到Y坐标
MotionEvent.ACTION_POINTER_1_DOWN:第一个触摸点点击事件
MotionEvent.ACTION_POINTER_2_DOWN:第二个触摸点点击事件
MotionEvent.ACTION_POINTER_1_UP:第一个触摸点松开事件
MotionEvent.ACTION_POINTER_2_UP:第二个触摸点松开事件

2.我们使用 OnTouchListener 监听View,实现一个OnTouchListener的方法,来设置View的侦听属性,然后实现onTouch(View view, MotionEvent event)的方法,就可以获取触屏的感应事件了。

  在该事件中,有两个参数可以用来获取对触摸的控制,这两个参数分别为:MotionEvent.getAction()和MotionEvent.ACTION_MASK,前者用于对单点触控进行操作,后者用于对多点触控进行操作,对于单点触控,由MotionEvent.getAction()可以得到以下几种事件:ACTION_DOWN、ACTION_UP,而对于多点触控,由MotionEvent.ACTION_MASK,我们可以得到:ACTION_POINTER_DOWN、ACTION_POINTER_UP,都是MotionEvent中的常量,可以直接调用。而有些常量则是单点和多点共用的,如:ACTION_MOVE,因此在按下时,必须标记单点与多点触控的区别。

3.具体代码实现:

public class MainActivity extends Activity implements View.OnTouchListener{
private ImageView mImageView;
private PointF startPoint = new PointF();
private PointF midPoint ;
private Matrix currentMatrix = new Matrix();
private Matrix matrix = new Matrix();
private float startDis;
private int mode = 0;//0 drag 1 scale
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView)findViewById(R.id.imageView);
mImageView.setOnTouchListener(this);
} @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & event.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:           // 第一个手指按下事件  
mode =0;
startPoint.set(event.getX(),event.getY());
currentMatrix.set(mImageView.getImageMatrix());
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:        // 手指放开事件  
mode = 0;
break; case MotionEvent.ACTION_MOVE:
float x = event.getX() - startPoint.x;
float y = event.getY() - startPoint.y;
if(mode == 0)// 是一个手指拖动  
{
matrix.set(currentMatrix);
matrix.postTranslate(x,y);
}else if (mode ==1)    // 两个手指滑动  {
float endDistance = distance(event);
if(endDistance>5f)
{
float scale = endDistance/startDis;
matrix.set(currentMatrix);
matrix.postScale(scale,scale,midPoint.x,midPoint.y);
}
} break;
case MotionEvent.ACTION_POINTER_DOWN:          // 第二个手指按下事件  
mode = 1;
startDis = distance(event);
if(startDis>5f)
{
midPoint = midPoint(event);
currentMatrix.set(mImageView.getImageMatrix());
}
break; }
// 设置ImageView的Matrix  
mImageView.setImageMatrix(matrix);
return true;
}
    // 计算两个触摸点之间的距离  
private 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);
}
  // 计算两个触摸点的中点  
private PointF midPoint(MotionEvent event)
{
float midX = (event.getX(1)+event.getX(0) )/2;
float midY = (event.getY(1)+event.getY(0) )/2; return new PointF(midX,midY);
}
}

在这段代码中,我们通过手指的操作来计算Matrix的值,然后设置图片的Matrix,实现图片的移动和缩放。

需要注意的是,在资源文件中,需要设置ImageView的scaleType为“matrix”。

Demo 下载

http://download.csdn.net/detail/q610098308/9511097

Android 多点触控与简单手势(一)的更多相关文章

  1. Android多点触控技术

    1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...

  2. [yueqian_scut]Android多点触控技术和应用框架

    Android多点触控技术跟Linux输入子系统紧密相关.本文将从应用的角度说明Android多点触控技术的接口和应用. 一.多点触控场景分析 网络上有关Android多点触控技术的文章多见于两点拉伸 ...

  3. Android多点触控手势基础

    处理多点触控手势 多点触控就是同时把一根以上的手指放在屏幕上. 再继续往下以前需要补充一些名词: 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的 ...

  4. Android多点触控技术实战,自由地对图片进行缩放和移动

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100327 在上一篇文章中我带着大家一起实现了Android瀑布流照片墙的效果, ...

  5. Android 多点触控错误处理(java.lang.IllegalArgumentException: pointerIndex out of range)

    最近做View的多点触控时,每次第一次触控事件完美运行,第二次就直接崩了,错误信息如下: 01-03 00:05:44.220 4377-4410/system_process E/AndroidRu ...

  6. 关于android多点触控

    最近项目需要一个多点触控缩放的功能.然后上网查了下资料 总结一下: 首先android sdk版本很重要,比如你在AndroidManifest.xml中指定android:minSdkVersion ...

  7. Android多点触控(图片的缩放Demo)

    本文主要介绍Android的多点触控,使用了一个图片缩放的实例,来更好的说明其原理.须要实现OnTouchListener接口,重写当中的onTouch方法. 实现效果图:       源码: 布局文 ...

  8. Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

    首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能.这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2 ...

  9. android 多点触控

    多点触控 1.多点触控从字面意思讲就是你用大于等于2根的手指触摸子啊手机屏幕上. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEv ...

随机推荐

  1. having和where的区别

    HAVING子句的使用. 例子: SELECT mob_belong_to,user_id,MAX(BIRTH_DATE) FROM user_base_info WHERE sign_in_date ...

  2. 搭建Tomcat6源代码阅读环境

    目标:使用MyEclipse8.5阅读Tomcat6源码. 第一步:在MyEclipse8.5中集成SVN插件. 第二步:从地址http://svn.apache.org/repos/asf/tomc ...

  3. Struts 2之动态方法调用,不会的赶紧来

    学习Struts2框架以来为了减少Action 的数量,我们可以使用动态方法进行处理. 动态方法调用(Dynamic Method Invocation,DMI)是指表单元素的Action并不是直接等 ...

  4. 传智播客JavaWeb day05-session、url重写

    1.session是什么 1.1 session是一种会话技术  ps:还有一种是cookie 2.session的作用 2.1 服务器端会话范围内的数据共享 3.session的生命周期 3.1何时 ...

  5. 防止apache下面直接输入目录访问文件

    有些项目链接会暴露服务器上面的文件地址,如何访问文件被访问呢 方法一: 在项目入口文件下面新加一个.htaccess文件(apache开启重写模式才会加载这个文件,否则这个文件配置不会生效) 文件中加 ...

  6. Python UDP broadcast PermissionError: [Errno 13] Permission denied

    /********************************************************************** * Python UDP broadcast Permi ...

  7. xml 解析的四种方式

    =========================================xml文件<?xml version="1.0" encoding="GB2312 ...

  8. PAT (Basic Level) Practise:1032. 挖掘机技术哪家强

    [题目链接] 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行 ...

  9. xmimd的第十天笔记

  10. Java常用正则表达式验证工具类RegexUtils.java

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexUtils{ /** * 正则表达式 ...