Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验。 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN而移动操作时为 ACTION_MOVE最终放开手指时触发ACTION_UP事件。当然还有用户无规则的操作可能触发ACTION_CANCEL这个动作.

对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的 onTouchEvent()方法来处理。

下面用ImageView做演示:

                           

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/pic"
android:scaleType="matrix" >
</ImageView>
</FrameLayout>

要注意的是 android:scaleType 的属性必须设置为matrix,否则图片无法改变大小。

java文件:

package com.shao.muti;import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;public class MutiTouchActivity extends Activity implements OnTouchListener{/** Called when the activity is first created. */private static final String TAG="Touch";private static final int NONE= 0 ;private static final int DRAG = 1;private static final int ZOOM =2;int mode  = NONE;Matrix matrix = new Matrix();Matrix savedMatrix =  new Matrix();PointF start = new PointF();PointF mid = new PointF();float oldDist = 1f;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);ImageView view = (ImageView) findViewById(R.id.imageView);view.setOnTouchListener(this);}@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubImageView view = (ImageView) v;printEventinfo(event);//测试输出信息switch(event.getAction()&MotionEvent.ACTION_MASK){case MotionEvent.ACTION_DOWN:savedMatrix.set(matrix);//設置初始點位置start.set(event.getX(),event.getY());Log.d(TAG,"mode=DRAG");mode  =DRAG;break;case MotionEvent.ACTION_POINTER_1_DOWN:oldDist= spacing(event);Log.d(TAG,"lodDist="+oldDist);if(oldDist>10f){savedMatrix.set(matrix);midPoint(mid,event);mode = ZOOM;Log.d(TAG,"mode=ZOOM");}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_POINTER_1_UP:mode  =NONE;Log.d(TAG,"mode=NONE");break;case MotionEvent.ACTION_MOVE:if(mode==DRAG){matrix.set(savedMatrix);matrix.postTranslate(event.getX()-start.x, event.getY()-start.y);}else if(mode == ZOOM){float newDist = spacing(event);Log.d(TAG, "newDist=" + newDist);if (newDist > 10f) {matrix.set(savedMatrix);float scale = newDist / oldDist;matrix.postScale(scale, scale, mid.x, mid.y);}}break;}view.setImageMatrix(matrix);return true;}private void printEventinfo(MotionEvent event){int num =0;System.out.println("触控动作---->"+event.getAction()); //获取触控动作比如ACTION_DOWNSystem.out.println("取触控点的数量--->"+event.getPointerCount()); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕num = event.getPointerCount();for(int i=0;i<num;i++){System.out.println("索引-->"+event.getPointerId(i)); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引System.out.println("第i个触控点的x位置-->"+event.getX(i)); //获取第i个触控点的x位置System.out.println("第i个触控点的y位置-->"+event.getY(i)); //获取第i个点触控的y位置System.out.println("手指压力-->"+event.getPressure(i)); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的}System.out.println("开始时间"+event.getDownTime()); //按下开始时间System.out.println(" 事件结束时间"+event.getEventTime()); // 事件结束时间System.out.println("总共按下时花费时间"+(event.getEventTime()-event.getDownTime())); //总共按下时花费时间}/** Determine the space between the first two fingers */private float spacing(MotionEvent event){float x = event.getX(0)-event.getY(1);float y = event.getY(0)-event.getY(1);return (float)Math.sqrt(x*x+y*y);}/** Calculate the mid point of the first two fingers */private void midPoint(PointF point, MotionEvent event) {float x = event.getX(0) + event.getX(1);float y = event.getY(0) + event.getY(1);point.set(x / 2, y / 2);}
}

android--多点触控的实现相关推荐

  1. Android多点触控详解

    本文转载自GcsSloop的 安卓自定义View进阶-多点触控详解 的文章 Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带 ...

  2. 模拟Android多点触控

    Android多点触控 Android多点触控 多点触控实现思路 第一种adb shell input方式 第二种adb shell sendevent方式 多点触控实现思路   经过资料的查询,要在 ...

  3. Android多点触控揭秘

    本文原创,转载请注明:http://blog.csdn.net/cloudzfy1/article/details/6582707 Google 暑期大学生博客分享大赛 - 2011 Android ...

  4. Android多点触控技术

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

  5. Android 多点触控消息捕获与处理

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

  6. Android 多点触控 MotionEvent详解

    相关API 介绍 MotionEvent.getY() 和 MotionEvent.getRawY() 的区别 getY 表示触摸事件在当前的View内的Y 坐标, getRawY表示触摸事件在整个屏 ...

  7. Android多点触控MultiTouch浅析

    申明: 参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0226/914.html 下面实现如何通过应用层支持多点触控操作, ...

  8. android 多点触控缩放,Android多点触控(图片的缩放Demo)

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

  9. 关于android多点触控

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

  10. android多点触控

    网上搜索后有很多的多点触控的东西,自己也写个吧,实现的就是在屏幕上画个圆角的矩形随着2点的大小而变换. 下面的东西是在网上找的一个例子然后自己更改的. View Code 1 package com. ...

最新文章

  1. RTP协议全解(H264码流和PS流)
  2. mckinsey game
  3. JBoss 4.2.x Spring 3 JPA Hibernate教程
  4. codeforce C. Okabe and Boxes
  5. php数据库搬家,php 用adodb实现数据库搬家
  6. 大文件上传NeatUpload简单用法
  7. 个人博客前后台整站开发——模板免费下载
  8. 端口映射抖音去水印源码
  9. 服务器端ssh文件夹,linux ssh服务器创建文件夹
  10. 分享下我 Github 被封的经历
  11. 安装Win7系统,提示缺少所需的CD/DVD驱动器设备驱动程序
  12. 多少秒算长镜头_电影术语中长镜头是什么意思?
  13. 创建zemax非序列光学系统
  14. 压缩文件报错 tar: Exiting with failure status due to previous errors
  15. 看网页视频如何自定义倍速(b站举例)
  16. (洛谷)小鱼的游泳时间
  17. 开源企业虚拟化Proxmox VE(PVE)6.3 安装
  18. ChatGPT 在做什么… 以及它为何发挥作用?最新关于ChatGPT的论文速递
  19. 2019年参加 PMP 认证考试了,通过的人心得分享
  20. 计算机毕业设计springboot+vue基本微信小程序的透析耗材管理系统

热门文章

  1. day3字符串操作作业详解
  2. 西藏春运送服务 让旅客带着温暖出发
  3. SD 协议与协议栈源码分析(SD 内存卡)
  4. 【Pyecharts | Map3D】带光影效果的3D地图 | 深圳地区二手房房价地图~
  5. PHP Rewrite (重写)
  6. Spring个人笔记
  7. UE4-第一课:开关门基础
  8. 小旋风蜘蛛池V9.02源码
  9. 为什么IT行业这么火?
  10. 语义网、本体、OWL基础知识梳理