知识点:

1、对矩阵:Matrix类熟悉,链接:https://blog.csdn.net/jdsjlzx/article/details/52741445

2、MotionEvent详解:https://blog.csdn.net/vansbelove/article/details/78416791

3、定位一个点使用:new PointF();

  getX()、getY():获取点相对于左上角的相对坐标

4、顺序:创建矩阵锁定位置--->创建常量记录触点动作--->创建点--->计算点间距、两点中心的位置

重点:1、计算两点之间的距离计算

      2、计算两点间中间点的位置

代码如下:

1、MainActivity.java源码:

 package com.example.moremovetest;

 import android.app.Activity;
import android.app.usage.UsageEvents.Event;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView; public class MainActivity extends Activity implements OnTouchListener{
private ImageView imageView; private Matrix matrix1=new Matrix();//创建一个矩阵,移动前的矩阵、移动后的矩阵
private Matrix matrix2=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 distance=1f;//最初两个手指按下的点之间的距离 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=(ImageView)findViewById(R.id.image);
imageView.setOnTouchListener(this);
} @Override
public boolean onTouch(View arg0, MotionEvent arg1) {
ImageView view=(ImageView)arg0; //参数中传入的view转换为ImageView //触摸设置:
switch (arg1.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: //第一个手指按下
matrix1.set(view.getImageMatrix()); //将图片大小设置一个单位矩阵
matrix2.set(matrix1); //将矩阵matrix1保存
startPoint.set(arg1.getX(), arg1.getY()); //设置第一个触点的位置
mode=DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN: //第二个手指按下
distance=distance(arg1); //函数distance(MotionEvent event)用于计算两点间的距离
//防止一个手指上出现两个茧
if(distance>10f) {
matrix2.set(matrix1);
midPoint=middle(arg1); //计算两个触点的中间点的位置
mode=ZOOM;
}
break;
//手指松开:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode=NONE;
break;
//手指滑动事件:
case MotionEvent.ACTION_MOVE:
if(mode==DRAG) {
//一个手指滑动:
matrix1.set(matrix2);
//位置迁移
matrix1.postTranslate(arg1.getX()-startPoint.x, arg1.getY()-startPoint.y);
}else if(mode==ZOOM){
//两个手指滑动
float newDistance=distance(arg1);
if(newDistance>10f) {
matrix1.set(matrix2);
float scale=newDistance/distance;
matrix1.postScale(scale, scale,midPoint.x, midPoint.y);
}
}
break;
default:
break;
}
//设置ImageView的矩阵(Matrix)
view.setImageMatrix(matrix1);
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);
}
}

2、activity_main.xml:

 <LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.moremovetest.MainActivity" > <ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/image"
android:scaleType="matrix"
/> </LinearLayout>

3、AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.moremovetest"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="18"
android:targetSdkVersion="22" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

Android学习之多触点滑动的更多相关文章

  1. Android学习笔记之滑动翻页(屏幕切换)

    如何实现手机上手动滑动翻页效果呢?呵呵,在这里我们就给你们介绍一下吧. 一般实现这个特效会用到一个控件:ViewFlipper <1>View切换的控件—ViewFlipper 这个控件是 ...

  2. Android学习之可滑动当前的Activity视图看见上一个活动的视图

    先看一下我的效果图吧: 好大的图啊!!! 百度音乐由一个很酷的功能,当前的UI可以滑动,然后看见上一个活动的UI,当时顿时觉得百度的牛人好多啊,能将如此前沿的技术应用到app上.当然如果你熟悉了And ...

  3. Android学习路线总结,绝对干货

    title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...

  4. 一篇文章一张思维导图看懂Android学习最佳路线

    一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...

  5. Android学习随笔--ListView的分页功能

    第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...

  6. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

  7. java+android学习路线图

    java.android学习路线图  看图之前先按住Ctrl键同时滑动鼠标滚轮

  8. android学习一些帖子

    关于谷歌和苹果的帖子 http://news.eoe.cn/18576.html android无线调试的帖子: http://baoyz.com/android/2014/06/24/adb-wir ...

  9. Android学习路线指南

    看到这位大牛的博文,不禁得感概,我最近也遇到了很多问题,内心彷徨不堪,转载大牛这篇博文,是为了更好的勉励自己.原文地址在最后面. 前言 看到一篇文章中提到"最近几年国内的初级Android程 ...

随机推荐

  1. prototype、proto和constructor的三角关系

    转载整理自http://www.cnblogs.com/xiaohuochai/p/5721552.html#3760057 http://blog.csdn.net/jasonzds/article ...

  2. blfs(systemd版本)学习笔记-前几章节的脚本配置

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 记录blfs书籍前几个章节的配置内容. bash shell启动文件章节 1.切换root用户 su 2.创建/etc/prof ...

  3. 【读书笔记】iOS-单元测试工具

    一,单元测试工具. 1,OCUnit 苹果自带的. 2,GHUnit GHUnit是Objective-C语言里的另外一种单元测试工具. GHUnit- https://github.com/gh-u ...

  4. 移动端reset

    * { margin: 0; padding: 0;}article, aside, details, figcaption, figure, footer, header, hgroup, main ...

  5. 【转】64位系统下无法使用libpam-mysql的md5

    转自:http://superwf.dyndns.info/?p=331 Aug 23 09:05:57 wfoffice saslauthd[7235]: pam_mysql – non-crypt ...

  6. 动态导入模块:__import__、importlib、动态导入的使用场景

    相关内容: __import__ importlib 动态导入的使用场景 首发时间:2018-02-23 16:06 __import__: 功能: 是一个函数,可以在需要的时候动态导入模块 使用: ...

  7. 13.2、进程的通信:Queue、Pipe、

    内容相关: 概念:进程的通信 Queue:创建与使用 Pipe:创建与使用 进程通信的概念 进程的资源空间是相互独立的,一般而言是不能相互访问的.但很多情况下进程间需要互相通信,来完成系统的某项功能. ...

  8. 山西WebGIS项目总结

    有一段时间没写blog了,说实话,最近的心态一直在变化,看了一部日剧,回想了这一年所学所见,感觉生活目标变了. 做国土项目这段时间不是很忙,由于数据一直给不到位,时间拖得很久,所以在这期间也在继续学习 ...

  9. maven(二):创建一个可用的maven项目,完整过程

    环境:eclipse4.5 (内置maven插件) 创建maven项目 文件菜单--新建--其他-- maven project 下一步 选择web 结构 group id:  指项目在maven本地 ...

  10. Ubuntu下matplotlib的中文显示

    真真地被matplotlib的中文显示折磨的不行了.简要记下解决方案,防止以后重新配又是蛋疼菊紧. 我的环境:系统是Ubuntu 13.04,Python是系统自带的,matplotlib是apt安装 ...