多点触摸(MultiTouch),指的是允许计算机用户同时通过多个手指来控制图形界面的一种技术。与多点触摸技术相对应的就是单点触摸,单点触摸的设备已经有很多年了,小尺寸的有触摸式的手机,大尺寸的最常见的就是银行里的ATM机和排队查询机等等。
多点触摸技术在实际开发过程中,用的最多的就是放大缩小功能。比如有一些图片浏览器,就可以用多个手指在屏幕上操作,对图片进行放大或者缩小。再比如一些浏览器,也可以通过多点触摸放大或者缩小字体。其实放大缩小也只是多点触摸的实际应用样例之一,有了多点触摸技术,在一定程度上就可以创新出更多的操作方式来,实现更酷的人机交互。
理论上,Android系统本身可以处理多达256个手指的触摸,这主要取决于手机硬件的支持。当然,支持多点触摸的手机,也不会支持这么多点,一般是支持2个点或者4个点。对于开发者来说,编写多点触摸的代码与编写单点触摸的代码,并没有很大的差异。这是因为,Android SDK中的MotionEvent类不仅封装了单点触摸的消息,也封装了多点触摸的消息,对于单点触摸和多点触摸的处理方式几乎是一样的。
在处理单点触摸中,我们一般会用到MotionEvent.ACTION_DOWN、ACTION_UP、ACTION_MOVE,然后可以用一个Switch语句来分别进行处理。ACTION_DOWN和ACTION_UP就是单点触摸屏幕,按下去和放开的操作,ACTION_MOVE就是手指在屏幕上移动的操作。
在处理多点触摸的过程中,我们还需要用到MotionEvent.ACTION_MASK。一般使用switch(event.getAction() & MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。代码调用这个“与”操作以后,当第二个手指按下或者放开,就会触发ACTION_POINTER_DOWN或者ACTION_POINTER_UP事件。
下面我们以一个实际的例子来说明如何在代码中实现多点触摸功能。在这里我们载入一个图片,载入图片后,可以通过一个手指对图片进行拖动,也可以通过两个手指的滑动实现图片的放大缩小功能。
view
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"android:id="@+id/frame"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/img"android:background="@drawable/paoku00199"/></FrameLayout>

java

private  float currentDistance=0;private float lastDistance=-1;private FrameLayout frame;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);frame= (FrameLayout) findViewById(R.id.frame);final ImageView img= (ImageView) findViewById(R.id.img);frame.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()){case MotionEvent.ACTION_DOWN: //触摸按下Log.i("MotionEvent","ACTION_DOWN");break;}switch (event.getAction()){case MotionEvent.ACTION_MOVE: //触摸移动Log.i("MotionEvent","ACTION_MOVE");FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) img.getLayoutParams();if(event.getPointerCount()==1) {//单个触摸点,并拖动图片System.out.println(String.format("X:%f,Y:%f", event.getX(), event.getY()));layoutParams.leftMargin = (int) event.getX()-10;layoutParams.topMargin = (int) event.getY()-10;img.setLayoutParams(layoutParams);}System.out.println("pointer count 触摸点个数"+event.getPointerCount());//触摸点个数//多个触摸点的坐标//手势放大缩小图片if (event.getPointerCount()>=2){System.out.println(String.format("多个触摸点的坐标X1:%f;Y1:%f", event.getX(0), event.getX(0)));float offsetX=event.getX(0)-event.getX(1);float offsetY=event.getY(0)-event.getY(1);currentDistance=(float)Math.sqrt(offsetX*offsetX+offsetY*offsetY);if(lastDistance<0){lastDistance=currentDistance;}else {if(currentDistance-lastDistance>5){    //5px;有误差FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) img.getLayoutParams();System.out.println("放大");lp.width= (int) (1.1f*img.getWidth());lp.height=(int) (1.1f*img.getHeight());img.setLayoutParams(lp);lastDistance=currentDistance;  //放大}else if (lastDistance-currentDistance>5){lastDistance=currentDistance;    //缩小FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) img.getLayoutParams();lp.width= (int) (0.9f*img.getWidth());lp.height=(int) (0.9f*img.getHeight());img.setLayoutParams(lp);}}}break;}switch (event.getAction()){case MotionEvent.ACTION_UP: //触摸弹起Log.i("MotionEvent","ACTION_UP");break;}return true;//true:需要催发后续事件;false:不需要须发后续事件(只能执行一次)}});}

注意:

private  float currentDistance=0;private float lastDistance=-1;

要onClick写在外面;

Android多点触摸交互处理,放大缩小图片相关推荐

  1. android+放大缩小图片+有jar嘛,Android相册支持点击放大图片,滑动切换图片,手势放大缩小...

    [实例简介] 项目使用了开源框架Universal-Image-Loader 显示本地图库所有照片 点击放大,单击退出 双击放大缩小 支持左右滑动查看图片 支持手势放大缩小图片 [实例截图] [核心代 ...

  2. JavaFX鼠标滚动放大缩小图片

    一.鼠标滚动放大缩小图片 package cn.util;import java.io.File; import javafx.application.Application; import java ...

  3. MTK 驱动(65)---Android 多点触摸协议(Multi-touch Protocol)

    Android 多点触摸协议(Multi-touch Protocol) Android 多点触摸协议Multi-touch Protocol A协议 B协议 代码编写 Protocol A Prot ...

  4. Jquery鼠标滚轮放大缩小图片

    使用Jquery鼠标点击图片,划动鼠标滚轮放大缩小图片. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  5. 鼠标滚轮放大/缩小图片

    <img id=pic src=" http://community.csdn.net/images/CSDN_logo.GIF" width=105 height=31 b ...

  6. jquery---实现滚轮放大缩小图片

    (1)滚轮控制放大缩小图片效果如图: 实现代码如下: <!DOCTYPE html> <html><head><meta charset="utf- ...

  7. 鼠标滚轮 放大缩小图片

    js实现鼠标滚轮放大缩小图片 <script>     //放大缩小图片     function   sdZoom(o)   {     var zoom=parseInt(o.styl ...

  8. Markdown给图片添加超链接,点击图片后,跳转新页面。放大缩小图片。

    公司用Markdown写了个项目说明 有个需求,就是点击图片,跳转到图片的链接(因为markdown不能放大缩小图片) 下面是超链接用法: ![alt属性文本](图片地址 ''图片title'') a ...

  9. android怎么监听多点触摸_Android多点触摸交互处理

    触摸操作是安卓最基本的交互方法,掌握多点触摸的开发可增强应用交互体验.首先需要了解触摸事件的侦听和传递,同时,本文介绍了单点.多点触摸的使用方法,并在此基础上,使用多点触控完成了一个缩放照片的简单例子 ...

最新文章

  1. 头脑风暴-如何减少软件项目对于人的依赖性。
  2. Java开发必会的Linux命令
  3. Java 8 - 04 类型检查、类型推断以及限制
  4. DL之VGGNet:VGGNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  5. LeetCode Algorithm 剑指 Offer 55 - II. 平衡二叉树
  6. 怎样才能娶到比尔-盖茨的女儿
  7. SpringMVC异常处理 自定义异常
  8. Django运行服务报NameError: name ‘os‘ is not defined-已解决
  9. 你是否了解新媒体,新媒体简介
  10. C-COT -- 超越相关滤波:学习连续卷积算子(Continuous Convolution Operators)
  11. 2019年04月02日清明上海迪士尼游
  12. 计算机进入不了管理器,电脑没有桌面且任务管理器打不开怎么办
  13. win7 64位下如何安装配置mysql
  14. 数据降维处理(PCALAD)
  15. python:鸡尾酒疗法
  16. @CrossOrigin Enabling CORS
  17. qtscrcpy自定义按键_QtScrcpy电脑控制手机 苹果般丝滑华为多屏协同般体验 免安装使用...
  18. 无向图的最大团/最大独立集 算法总结
  19. tk芯片智能机刷机方法_安卓智能机(MTK)通用刷机教程(卡刷)
  20. 【VirtualAPP 双开系列07】第三方 APP Service、Provider 加载分析

热门文章

  1. 天昊生物16S扩增子绝对定量测序项目文章再次登陆《Science of the Total Environment》...
  2. metaProdigal:宏基因组序列中的基因和翻译起始位点预测
  3. Cell子刊:人类微生物组参考基因集中的单体基因
  4. QIIME 2用户文档. 16鉴定和过滤嵌合体序列q2-vsearch(2018.11)
  5. 综述 | 森林微生物组:多样性,复杂性和动态变化(IF:11.3)
  6. 史上最权威宏基因组软件评估—人工重组宏基因组基准数据集
  7. R语言使用randomForest包构建随机森林模型的步骤和流程、随机森林算法包括抽样样本(观察)和变量来创建大量的决策树(多个树,构成了森林,而且通过样本抽样和变量抽样,让多个树尽量不同)
  8. pandas使用groupby函数和count函数返回的是分组下每一列的统计值(不统计NaN缺失值)、如果多于一列返回dataframe、size函数返回分组下的行数结果为Series(缺失值不敏感)
  9. R语言在可视化图像中添加文本(Adding Text to plot)
  10. python使用Spacy迁移学习库进行句法分析实战