MultiTouch————多点触控,伸缩图片,变换图片位置

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

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

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

示例图片:

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

具体代码实现:


布局文件 activtiy_main.xml

 1     <?xml version="1.0" encoding="utf-8"?>
 2     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3         xmlns:tools="http://schemas.android.com/tools"
 4         android:layout_width="match_parent"
 5         android:layout_height="match_parent"
 6         tools:context="com.cnwuth.mutiltouch.MainActivity">
 7
 8         <ImageView
 9             android:id="@+id/iv"
10             android:layout_width="match_parent"
11             android:layout_height="match_parent"
12             android:scaleType="matrix"
13             android:src="@mipmap/ic_launcher"/>
14
15     </RelativeLayout>  

MainActivity.java

  1     package com.cnwuth.mutiltouch;
  2
  3     import android.graphics.Matrix;
  4     import android.graphics.PointF;
  5     import android.support.v7.app.AppCompatActivity;
  6     import android.os.Bundle;
  7     import android.view.MotionEvent;
  8     import android.view.View;
  9     import android.widget.ImageView;
 10
 11     public class MainActivity extends AppCompatActivity implements View.OnTouchListener{
 12
 13         private ImageView mImageView;
 14
 15         //缩放控制
 16         private Matrix mMatrix = new Matrix();
 17         private Matrix savedMatrix = new Matrix();
 18
 19         //不同状态的表示
 20         private static final int NONE = 0;
 21         private static final int DRAG = 1;
 22         private static final int ZOOM = 2;
 23         private int mode = NONE;
 24
 25         //定义第一个按下的点,两只接触点的重点,以及出事的两指按下的距离:
 26         private PointF startPoint = new PointF();
 27         private PointF midPoint = new PointF();
 28         private float oriDis = 1f;
 29
 30         @Override
 31         protected void onCreate(Bundle savedInstanceState) {
 32             super.onCreate(savedInstanceState);
 33             setContentView(R.layout.activity_main);
 34             mImageView = (ImageView) findViewById(R.id.iv);
 35             mImageView.setOnTouchListener(this);
 36         }
 37
 38         @Override
 39         public boolean onTouch(View v, MotionEvent event) {
 40             ImageView view = (ImageView) v;
 41             switch (event.getAction() & MotionEvent.ACTION_MASK)
 42             {
 43                 //单指
 44                 case MotionEvent.ACTION_DOWN:
 45                     mMatrix.set(view.getImageMatrix());
 46                     savedMatrix.set(mMatrix);
 47                     startPoint.set(event.getX(),event.getY());
 48                     mode = DRAG;
 49                     break;
 50                 //双指
 51                 case MotionEvent.ACTION_POINTER_DOWN:
 52                     oriDis = distance(event);
 53                     if (oriDis > 10f)
 54                     {
 55                         savedMatrix.set(mMatrix);
 56                         midPoint = middle(event);
 57                         mode = ZOOM;
 58                     }
 59                     break;
 60                 //手指放开
 61                 case MotionEvent.ACTION_UP:
 62                 case MotionEvent.ACTION_POINTER_UP:
 63                     mode = NONE;
 64                     break;
 65                 //单指滑动事件
 66                 case MotionEvent.ACTION_MOVE:
 67                     if (mode == DRAG)
 68                     {
 69                         //是一个手指拖动
 70                         mMatrix.set(savedMatrix);
 71                         mMatrix.postTranslate(event.getX() - startPoint.x , event.getY() - startPoint.y);
 72                     }
 73                     else if (mode == ZOOM)
 74                     {
 75                         //两个手指滑动
 76                         float newDist = distance(event);
 77                         if (newDist > 10f)
 78                         {
 79                             mMatrix.set(savedMatrix);
 80                             float scale = newDist / oriDis;
 81                             mMatrix.postScale(scale , scale , midPoint.x , midPoint.y);
 82                         }
 83                     }
 84                     break;
 85             }
 86             //设置ImageView的Matrix
 87             view.setImageMatrix(mMatrix);
 88             return true;
 89         }
 90
 91         //计算两个触摸点之间的距离
 92         private float distance(MotionEvent event) {
 93             float x = event.getX(0) - event.getX(1);
 94             float y = event.getY(0) - event.getY(1);
 95             return (float) Math.sqrt(x * x + y * y);
 96         }
 97
 98         //计算两个触摸点的中点
 99         private PointF middle(MotionEvent event){
100             float x = event.getX(0) + event.getX(1);
101             float y = event.getY(0) + event.getY(1);
102             return new PointF(x / 2 , y / 2);
103         }
104     }  

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

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

时间: 2024-08-09 01:34:07

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

Android实现多点触控,自由缩放图片

Android多点触控涉及到的知识点 1.ScaleGestureDetector 2.OnScaleGestureListener 3.Matrix 4.OnTouchListener 四个知识点需要了解一下,需要注意的是Matrix在内存中是一个一维数组,操控图片的Matrxi是一个3X3的矩阵,在内存中也就是一个大小为9的一维数组. 实现多点触控,自由变化图片 1. ImageView的基础上继承 2.因为要在图片加载完成就获取到相关的属性,所以实现OnGlobalLayoutListen

Android实现图片多点触控自由伸缩

简介 作为Android开发者,我们经常需要自定义控件,比如下面我们说的实现图片的多点触控和伸缩释放,这也是由于用户已经有这样的常识了,那就是看见有图片的地方就可以点击查看大图,并且可以通过手指对图片进行伸缩和移动,如果应用没有实现这一点,那么对用户来说将会是很糟糕的体验,用户很"愤怒".所以作为Android开发者,我们的任务就是让用户"爽".哈哈哈....下面我们将通过自定义ImageView实现以上功能. 涉及技术 一.Matrix(矩阵),Android是通

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

本文主要介绍Android的多点触控,使用了一个图片缩放的实例,来更好的说明其原理.需要实现OnTouchListener接口,重写其中的onTouch方法. 实现效果图: 源代码: 布局文件: activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&quo

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

首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能,这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2.图片缩放小于正常比例时,松手会自动回弹成正常比例 3.图片缩放大于最大比例时,松手会自动回弹成最大比例 实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements

图片缩放和多点触控

实现图片的缩放并不难,主要需要一些计算和对图片的平移及缩放操作 主布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_

(三)多点触控之自由移动缩放后的图片

在上一篇文章中,将图片的自由缩放功能基本上完成了.效果还不错.如果你还没读过,可以点击下面的链接:http://www.cnblogs.com/fuly550871915/p/4939954.html 接下来这个项目要往前走,在自由缩放的基础上实现自由移动.要用的知识点就是OnTouchListener对移动手势的监控.在写代码之前我们应该考虑下面的几个问题: (1)什么时候可以移动?当图片比屏幕大时才需要移动,如果图片在屏幕内显示,没必要移动.(2)当移动的距离达到多少时才触发移动效果?在这里

Android多点触控MultiTouch浅析

申明: 参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0226/914.html 下面实现如何通过应用层支持多点触控操作,对于常规的控件触控操实现onTouchEvent()方法来处理.同时对onTouchEvent方法的参数MotionEvent进行一些了解. 正文: 下面会用两个应用示例来初步学习一下Android中的多点触控. 示例一(DemoMultiTouch-Canvas): 核心技术介绍 本示例是在Sur

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

多点触控(multi-touch)是通过触摸屏幕与应用程序进行交互的一种方式.多点触控输入和更传统的基于笔(pen-based)的输入的区别是多点触控识别手势(gesture)——用户可移动多根手指以执行常见操作的特殊方式.例如,在触摸屏上放置两根手指并同时移动他们,这通常意味着“放大",而以一根手指为支点转动另一根手指意味着"旋转".并且因为用户直接在应用程序窗口中进行这些手势,所以每个手势自然会被连接到某个特定的对象.例如,简单的具有多点触控功能的应用程序,可能会在虚拟桌

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

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100327 在上一篇文章中我带着大家一起实现了Android瀑布流照片墙的效果,虽然这种效果很炫很酷,但其实还只能算是一个半成品,因为照片墙中所有的图片都是只能看不能点的.因此本篇文章中,我们就来对这一功能进行完善,加入点击图片就能浏览大图的功能,并且在浏览大图的时候还可以通过多点触控的方式对图片进行缩放. 如果你还没有看过 Android瀑布流照片墙实现,体验不规则排列的美感