知识点:

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. Nhibernate学习的第二天

    Fluent-Nhibernate   网站:http://www.fluentnhibernate.org/ 使用NuGet下载Fluent-Nhibernate. 1.创建实体类 2.创建实体类映 ...

  2. js查询数组或者List类型是否包含某个元素

    方法一:arr.indexOf(某元素) 实际用法:if(arr.indexOf(某元素) > -1){//则包含该元素} 例: var fruits = ["Banana" ...

  3. CSS-高度塌陷问题

    目录 CSS-高度塌陷问题 表现 产生的原因 高度塌陷的解决办法: BFC相关 CSS-高度塌陷问题 表现 例如: HTML: <div class="first"> ...

  4. lfs(systemd版本)学习笔记-第3页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemd)学习笔记-第2页 的地址:https://www.cnblogs.com/renren-study-no ...

  5. CSS中你知道的display的值有多少?用了多少?

    它的语法如下: display:none | inline | block | list-item | inline-block | table | inline-table | table-capt ...

  6. 【读书笔记】iOS-iOS流媒体

    在网络上直接看电影已经不是什么新鲜的事情,在iOS等移动设备上也有很多在线视频应用,如国内的PPS和PPLive应用,还有一些新闻视频都可以在线观看,如USA TODY.所以这些在线视频都采用流媒体技 ...

  7. LyX快捷键管理

    快捷键修改:Tools->Preference->Editing->Shortcuts:修改后要Tools->Reconfig生效 快捷键默认保存文件:%appdata%\Ly ...

  8. Java并发编程(七)深入剖析ThreadLocal

    一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多.可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个 ...

  9. Java并发编程(三)Thread类的使用

    一.线程的状态 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocked).time wait ...

  10. VirtualBox下安装CentOS7系统

    本文假定你已经知道如何安装VirtualBox虚拟机软件,并且已经安装好了. 首先我们需要准备好centos的iso镜像文件,可以从centos的官网下载. 以下操作使用的VirtualBox版本号是 ...