Android学习之多触点滑动
知识点:
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学习之多触点滑动的更多相关文章
- Android学习笔记之滑动翻页(屏幕切换)
如何实现手机上手动滑动翻页效果呢?呵呵,在这里我们就给你们介绍一下吧. 一般实现这个特效会用到一个控件:ViewFlipper <1>View切换的控件—ViewFlipper 这个控件是 ...
- Android学习之可滑动当前的Activity视图看见上一个活动的视图
先看一下我的效果图吧: 好大的图啊!!! 百度音乐由一个很酷的功能,当前的UI可以滑动,然后看见上一个活动的UI,当时顿时觉得百度的牛人好多啊,能将如此前沿的技术应用到app上.当然如果你熟悉了And ...
- Android学习路线总结,绝对干货
title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...
- 一篇文章一张思维导图看懂Android学习最佳路线
一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...
- Android学习随笔--ListView的分页功能
第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
- java+android学习路线图
java.android学习路线图 看图之前先按住Ctrl键同时滑动鼠标滚轮
- android学习一些帖子
关于谷歌和苹果的帖子 http://news.eoe.cn/18576.html android无线调试的帖子: http://baoyz.com/android/2014/06/24/adb-wir ...
- Android学习路线指南
看到这位大牛的博文,不禁得感概,我最近也遇到了很多问题,内心彷徨不堪,转载大牛这篇博文,是为了更好的勉励自己.原文地址在最后面. 前言 看到一篇文章中提到"最近几年国内的初级Android程 ...
随机推荐
- canvas-2lineCap.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- inheritCombination.js
// 组合继承 // 其基本思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承 function Person(name){ this.name = name; th ...
- 不固定个数组,进行一一对应的组合,js将多个数组实现排列组合
var arr = [ ["a", "b"], ["1", "2"], ["d"] ]; var s ...
- java获取文件路径
情况:工程项目没有放到tomcat下,在eclipse运行 1.获取项目根目录,根据在哪里运行 2. 3.从最终生成的.class文件为着手点 4.在controller下
- mysql从入门到放弃-入门知识介绍
数据库在互联网网站的重要性 简单地说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构来组织和存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据.由于数据库不易扩展,所以,在一个互 ...
- Salesforce的翻译工作台
翻译工作台 Salesforce提供了翻译工作台.在这里管理员可以对各种数据进行翻译设置,包括对象信息.字段信息.验证规则.错误信息等. 翻译工作台集中了翻译的内容,从而使得管理员或开发者不需要在其他 ...
- Nginx 增加 Image 缩略图 功能
Nginx 增加 Image 缩略图功能,需要使用Nginx Image 缩略图 模块 官网地址:https://github.com/3078825/ngx_image_th ...
- U8 应付款管理 单据类型 分析
Ap_CloseBill 收付款单主表 Ap_CloseBills 收付款单子表 cVouchType 在收付款单主表中 ,用于区分单据为收款单还是付款单(48,49) 49:付款单 48:收 ...
- python格式化字符串format函数
1. format可以接受无限个的参数,位置可以不按顺序: In [1]: "{} {}".format("hello","world") ...
- charles系列破解激活办法(最高charles4.2都可以激活)
// Charles Proxy License // 适用于Charles任意版本的注册码,谁还会想要使用破解版呢. // Charles 4.2目前是最新版,可用. Registered Na ...