知识点:

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. 【代码笔记】Web-ionic-表单和输入框

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  2. macos 下安装brew

    1.终端执行 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master ...

  3. [20171106]配置客户端连接注意.txt

    [20171106]配置客户端连接注意.txt --//在配置客户端连接时一般建议使用Net Manager工具,windows下调用执行Net Manager.--//linux下执行 netmgr ...

  4. tkinter中Radiobutton单选框控件(七)

    Radiobutton控件 由于本次内容中好多知识都是之前重复解释过的,本次就不做解释了.不太清楚的内容请参考tkinter1-6节中的内容 import tkinter wuya = tkinter ...

  5. Centos 如何关闭自动更新

    法一 安装Centos 6.5后,系统yum自动更新状态默认为开启,若禁止系统自动更新需要手动关闭. 1.进入yum目录 [root@localhost ~]$ cd /etc/yum 2.编辑yum ...

  6. StartUML用法

    转载地址  http://blog.csdn.NET/tianhai110 (下面参考了原博主的内容,也加入自己的内容,为了自己脑补,也方便其他看到的人脑补) 使用StartUML绘制用例图:     ...

  7. eclipse中SVN报错解决

    在Eclipse市场上安装完SVN插件后连接SVN时出现以下错误: SVN: '0x00400006: Validate Repository Location' operation finished ...

  8. Django框架的使用教程--环境的搭建和项目的创建[一]

    Django环境的搭建 Django 常用的命令 # 创建一个名为Django_test子应用 python manage.py startapp Django_test # 生成迁移文件 pytho ...

  9. flask框架的教程--程序的基本结构[二]

    一个简单的程序 from flask import Flask # 实例化app 对象 app = Flask(__name__) @app.route('/') def index(): retur ...

  10. January 23rd, 2018 Week 04th Tuesday

    Remembrance is a form of meeting, forgetfulness is a form of freedom. 记忆是一种相遇,遗忘是一种自由. Cherish those ...