前言:当今的手机都支持多点触控功能(可以进行图片伸缩,变换位置),但是我们程序员要怎样结合硬件去实现这个功能呢?

跟随我一起,来学习这个功能

国际惯例:先上DEMO免费下载地址:http://download.csdn.net/detail/cnwutianhao/9443667

示例图片:

我是用Genymotion录制的,没有真机上多点触控显示的效果那么好,大家在真机上跑程序,会体会到多点触控功能。(注:Genymotion多点触控快捷键是 ctrl+鼠标指针上下拖动)

具体代码实现:


布局文件 activtiy_main.xml

     <?xml version="1.0" encoding="utf-8"?>
     <RelativeLayout 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"
         tools:context="com.cnwuth.mutiltouch.MainActivity">  

         <ImageView
             android:id="@+id/iv"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:scaleType="matrix"
             android:src="@mipmap/ic_launcher"/>  

     </RelativeLayout>  

MainActivity.java

     package com.cnwuth.mutiltouch;  

     import android.graphics.Matrix;
     import android.graphics.PointF;
     import android.support.v7.app.AppCompatActivity;
     import android.os.Bundle;
     import android.view.MotionEvent;
     import android.view.View;
     import android.widget.ImageView;  

     public class MainActivity extends AppCompatActivity implements View.OnTouchListener{  

         private ImageView mImageView;  

         //缩放控制
         private Matrix mMatrix = new Matrix();
         private Matrix savedMatrix = new Matrix();  

         //不同状态的表示
         private static final int NONE = 0;
         private static final int DRAG = 1;
         private static final int ZOOM = 2;
         private int mode = NONE;  

         //定义第一个按下的点,两只接触点的重点,以及出事的两指按下的距离:
         private PointF startPoint = new PointF();
         private PointF midPoint = new PointF();
         private float oriDis = 1f;  

         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.activity_main);
             mImageView = (ImageView) findViewById(R.id.iv);
             mImageView.setOnTouchListener(this);
         }  

         @Override
         public boolean onTouch(View v, MotionEvent event) {
             ImageView view = (ImageView) v;
             switch (event.getAction() & MotionEvent.ACTION_MASK)
             {
                 //单指
                 case MotionEvent.ACTION_DOWN:
                     mMatrix.set(view.getImageMatrix());
                     savedMatrix.set(mMatrix);
                     startPoint.set(event.getX(),event.getY());
                     mode = DRAG;
                     break;
                 //双指
                 case MotionEvent.ACTION_POINTER_DOWN:
                     oriDis = distance(event);
                     if (oriDis > 10f)
                     {
                         savedMatrix.set(mMatrix);
                         midPoint = middle(event);
                         mode = ZOOM;
                     }
                     break;
                 //手指放开
                 case MotionEvent.ACTION_UP:
                 case MotionEvent.ACTION_POINTER_UP:
                     mode = NONE;
                     break;
                 //单指滑动事件
                 case MotionEvent.ACTION_MOVE:
                     if (mode == DRAG)
                     {
                         //是一个手指拖动
                         mMatrix.set(savedMatrix);
                         mMatrix.postTranslate(event.getX() - startPoint.x , event.getY() - startPoint.y);
                     }
                     else if (mode == ZOOM)
                     {
                         //两个手指滑动
                         float newDist = distance(event);
                         if (newDist > 10f)
                         {
                             mMatrix.set(savedMatrix);
                             float scale = newDist / oriDis;
                             mMatrix.postScale(scale , scale , midPoint.x , midPoint.y);
                         }
                     }
                     break;
             }
             //设置ImageView的Matrix
             view.setImageMatrix(mMatrix);
             return true;
         }  

         //计算两个触摸点之间的距离
         private float distance(MotionEvent event) {
             float x = event.getX(0) - event.getX(1);
             float y = event.getY(0) - event.getY(1);
             return (float) Math.sqrt(x * x + y * y);
         }  

         //计算两个触摸点的中点
         private PointF middle(MotionEvent event){
             float x = event.getX(0) + event.getX(1);
             float y = event.getY(0) + event.getY(1);
             return new PointF(x / 2 , y / 2);
         }
     }  

(注:环境需要在Android Studio下运行,并且SDK更新到最新,否则会出现报错)

关注我的最新动态;新浪微博 @吴天昊TnnoWu        地址:weibo.com/cnwutianhao

MultiTouch————多点触控,伸缩图片,变换图片位置的更多相关文章

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

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

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

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

  3. 【WPF学习】第十八章 多点触控输入

    多点触控(multi-touch)是通过触摸屏幕与应用程序进行交互的一种方式.多点触控输入和更传统的基于笔(pen-based)的输入的区别是多点触控识别手势(gesture)——用户可移动多根手指以 ...

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

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

  5. (一)自定义ImageView,初步实现多点触控、自由缩放

    真心佩服那些一直专注于技术共享的大神们,正是因为他们无私的分享精神,我才能每天都有进步.近日又算是仔细学了android的自定义控件技术,跟着大神的脚步实现了一个自定义的ImageView.里面涉及到 ...

  6. Android多点触控技术

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

  7. Android 多点触控与简单手势(一)

    现在一般的Android手机都会使用电容触摸屏最少可以支持两点触摸,多的可能是七八个,所以基本上都会支持多点触控, android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求. And ...

  8. (干货) Android实现ImageVIew多点触控及双击缩放

    支持多点触控,放大自由移动,双击可以放大缩小.直接上代码: package com.cbt.view; import android.content.Context; import android.g ...

  9. (五)多点触控之兼容ViewPager

    在上一篇文章中,自定义的ZoomImageView已经实现了自由缩放,自由移动以及双击放大与缩小的功能.已经可以投入使用这个控件了.下面我们就在ViewPager中使用这个控件.如果你还没读过上一篇文 ...

随机推荐

  1. 在Mac上安装IntelliJ IDEA

    这篇文章旨在介绍如何在Mac系统上安装IntelliJ IDEA,至于IntelliJ IDEA的介绍和使用方法,大家另行查阅,本篇的文章不再详细阐述. 简短解说,IntelliJ IDEA是可以用来 ...

  2. android之存储篇_SQLite数据库_让你彻底学会SQLite的使用

    SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中 ...

  3. Java写操作

    //:ThinkingInJava/net.mindview.io/write2File.java package net.mindview.io; import java.io.BufferedRe ...

  4. 使用commons-logging和log4j记录日志

    一,为什么要使用commons-logging+log4j? commons-logging和log4j都是Apache下的开源项目.commons-logging的目的是为“所有的Java日志实现” ...

  5. javascript第四节其它引用对象

    单体对象 Global对象(全局)这个对象不存在,无形的对象 其内部定义了一些方法和属性:encodeURL.encodeURIComponent.decodeURI.decodeURICompone ...

  6. Android(Xamarin)之旅(二)

    新的一年,新的开始,2016,我要做什么,大家要做什么,啦啦啦. OK,上篇已经介绍了几个简单的控件,这次,我们继续说说控件.但是可能有人认为这有什么难的,问题不在这里,而在于,如果你注意了每一个空间 ...

  7. (2015秋) 作业6:(电梯系统之结对编程 I 总分=2*50 分)

    电梯系统 0. 背景 南通大学钟秀校区“主教学楼” 用 2 部电梯(连地下室共9层):每到下课.上课前都特别拥挤,大家希望改进已有的电梯调度算法,满足学生和老师快速乘坐电梯的需要.因此,需要重新设计一 ...

  8. N皇后

    #include <stdio.h> #include <math.h> ], a[]; /*int place(int k) { for(int i = 1; i < ...

  9. 基于ticket的rw锁

    代码: wiredtiger-2.8.0/src/os_posix/os_mtx_rw.c rw锁结构 struct { uint16_t writers; // Now serving for wr ...

  10. iOS 用代码+Xib搭建UI界面实例

    1.背景 有些我们不能只用代码去构建界面,代码是万能的,你用其他方式可以实现的界面,用代码也一定能 实现,但是我们没必要这样做,有的时候用xib会是更好的选择,代码和xib的优劣地方我们得知道,为了 ...