【多点触摸概述与手势实现】苹果电脑右键触摸手势

  摘要:多点触摸随着iphone的推出风靡全球,是当今最炙手可热的人机交互方式。该文对多点触摸的原理和编程模型进行简要的介绍,并给出了一些触摸手势的C#编程实现。   关键词:多点触摸;手势;C#
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)06-1387-03
   1概述
  多点触摸作为一种全新的人机交互方式随着iphone的推出风靡全球。它允许人们直接使用双手作为输入设备控制我们的手机或者电脑,我们可以使用双指或者多根手指进行复杂的操作,大家都爱上了这种生动、多样、灵活、自然的交互体验。Google的Android、微软的Windows 7、Window Phone 7以及即将推出的Windows 8都加入了对多点触摸的支持,多点触摸成为现在最炙手可热的人机交互技术。
   2多点触摸原理
  目前我们的电脑或者手机都是通过感应电容触摸屏(以下简称电容屏)实现多点触摸的。电容屏的玻璃表面贴有一层透明的特殊金属导电物质,当手指触碰时触点的电容会发生变化,从而可以获知触点的位置。电容屏又分为两类,自电容感应和互电容感应。
  1)自电容感应
  自电容感应的感应单元是分立的行和列,他们分别检测行和列上面的电容变化。如果只有一个触摸点的时候,行列上面都只有一个电容最大值,因此可以准确获得触摸的位置。但是当有两个触摸点的时候,行列上面会有两个电容最大值,这个时候就会产生“鬼点”现象,无法准确获得触摸点的位置,如图1所示。不过由于可以判断出两个手指的运动方向,所以依然可以进行缩放、平移、旋转等多点手势操作。
  
  图1
  2)互电容感应
  互电容感应是目前主流的电容屏技术。由于它对每行每列交叉点都进行单独扫描检测,所以它可以识别到触摸的具体位置,没有自电容感应的“鬼点”现象。而且它可以检测到双手10个手指的同时触摸,也支持其他非手指触摸方式,如手掌、脸、拳头等,甚至戴手套也可以,是最人性化的人机接口方式,非常适合多手同时进行操作的应用。
  当前大部分的触摸设备都是采用互电容感应的方式。设备通过触摸屏采集原始触摸数据,并将数据按各系统规定的协议进行封装上传至系统,由系统进行后续的解析、手势识别等计算。
   3多点触摸编程模型
  目前主流支持多点触摸的操作系统所采用的多点触摸编程模型基本一致。模型将一个或多个和屏幕接触的手指识别为多点触摸序列的一部分。序列从第一个手指接触屏幕开始,以最后一个手指离开屏幕为结束。模型通过多点触摸序列跟踪与屏幕接触的手指,记录手指在屏幕上的位置和接触时间。模型会发送两种类型的事件供应用程序调用。一种是直接将手指的触摸信息包括位置、时间戳、关联视图等作为事件提供给应用程序,应用程序自己提供处理逻辑对触摸信息进行处理;一种是模型将特定组合的触摸识别为手势提供给应用程序,应用程序会根据手势以用户直观的方式进行响应。
   4手势实现
  多点触摸最大的优势就是用户可以通过手势进行复杂的操作。比如收缩双指距离的手势,程序的响应就是缩小显示的内容;对轻拂屏幕的手势,则响应为滚动显示的内容。本文将介绍一些基本手势的c#程序实现,包括双指旋转、双指放缩、双指平移等以供读者举一反三,实现更加复杂的手势。
  定义触摸信息类,代码如下。public class TouchData
  { public bool IsTouch=true;//是否触摸public int X;//触摸横坐标public int Y;//触摸纵坐标
  }
  public class MultiTouchData
  { //一次触摸包括多个手指的触摸信息,系统默认编号1,2,3,・・・・・・
  public Dictionary touchDict;
  public int distX;//双指横坐标差
  public int distY;//双指纵坐标差,这两个用来判断旋转
  public int avgX;//双指横坐标平均值
  public int avgY;//双指纵坐标平均值,这两个用来判断双指平移
  public double length;//双指距离,用来判断放缩
  public MultiTouchData()
  { touchDict = new Dictionary(); for (int i = 1; i = 0.13){//两个向量角度大于15°则认为发生旋转double angle = Math.Atan((double)lastData.distY / lastData.distX); OnDoubleTouchRotate(angle, rotate); //发送旋转事件IsRotate = true;//旋转变量置真lastData = newData;//更新起始点
  return true;} else return false;}
  下面是判断双指放缩的代码。
  private bool IsDoubleTouchZoom(MultiTouchData newData){ if (Math.Abs(newData.length - lastData.length) >= 3){
  //两次触摸双指距离差大于3,说明发生放缩操作//计算放缩比例
  double zoom = (double)newData.length / lastData.length; OnZoom(zoom);//发送放缩事件IsZoom = true;//放缩变量置为真lastData = newData;//更新起始点
  return true;}
  else
  return false;}
  最后是判断双指平移的代码。
  private bool IsDoubleTouchMove(MultiTouchData newData)
  {
  //计算双指触摸中心点坐标差
  int xdist = newData.avgX - lastData.avgX; int ydist = newData.avgY - lastData.avgY;
  if ((Math.Abs(xdist) >= 3) || (Math.Abs(ydist) >= 3)){
  坐标差大于3说明发生平移操作
  OnDoubleTouchMove(xdist, ydist);//发送双指平移事件IsMove = true;//置平移信号为真lastData = newData;//更新起始点位置
  return true;}
  else
  return false;}
   5结束语
  该文大致介绍了多点触摸的原理和编程模型,并给出了一些手势的编程实现。随着iphone的持续畅销,其他厂家的积极跟进,多点触摸将继续全球的狂热。广大计算机知识的爱好者可以自己动手实现一些多点触摸的手势操作,相信会有一定的市场效应。
  参考文献:
  [1]肖学军,郑赞.最新多点触摸屏技术介绍[Z].
  [2] Iphone应用程序编程指南[B].
  [3] Windows Touch编程指南[B].

推荐访问:多点 手势 概述 触摸