进阶篇-安卓系统:2.多点触控的交互处理

1.android 触摸事件侦听

安卓的用户交互方式包括两种,一种是点击交互,一种是触摸交互。点击交互就是手指按下抬起一个动作组。而触摸交互分为按下(down),移动(move),抬起(up)。

触摸事件侦听代码:输出触摸事件的三个动作:

我们用一个framlayout布局进行操作

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;public class MainActivity extends AppCompatActivity {private FrameLayout container;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE:System.out.println("action:move");break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}
}

注意:记得把onTouch方法的返回值改成true。

运行结果:

07-13 14:35:19.883 11720-11720/bhu.com.myapplication I/System.out: action:down
07-13 14:35:19.924 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.954 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.964 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.984 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.984 11720-11720/bhu.com.myapplication I/System.out: action:up

2.获取触摸的当前坐标

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;public class MainActivity extends AppCompatActivity {private FrameLayout container;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE:System.out.println(String.format("(%f,%f)",motionEvent.getX(),motionEvent.getY()));break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}
}

输出结果:

07-13 14:39:50.442 11720-11720/bhu.com.myapplication I/System.out: (366.251312,682.000000)
07-13 14:39:50.452 11720-11720/bhu.com.myapplication I/System.out: (367.076874,682.000000)
07-13 14:39:50.472 11720-11720/bhu.com.myapplication I/System.out: (367.000000,680.500000)
07-13 14:39:50.482 11720-11720/bhu.com.myapplication I/System.out: (368.067780,681.000000)
07-13 14:39:50.512 11720-11720/bhu.com.myapplication I/System.out: (369.000000,681.000000)
07-13 14:39:50.532 11720-11720/bhu.com.myapplication I/System.out: (370.142609,681.000000)
07-13 14:39:50.542 11720-11720/bhu.com.myapplication I/System.out: (371.500000,681.000000)
07-13 14:39:50.582 11720-11720/bhu.com.myapplication I/System.out: (373.497681,681.000000)
07-13 14:39:50.592 11720-11720/bhu.com.myapplication I/System.out: (374.960114,681.000000)
07-13 14:39:50.612 11720-11720/bhu.com.myapplication I/System.out: (376.413116,681.000000)

3.实现拖动控件

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;public class MainActivity extends AppCompatActivity {private FrameLayout container;private ImageView imv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);imv = (ImageView) findViewById(R.id.imv);container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE://System.out.println(String.format("(%f,%f)",motionEvent.getX(),motionEvent.getY()));FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();lp.leftMargin = (int) motionEvent.getX();lp.topMargin = (int) motionEvent.getY();imv.setLayoutParams(lp);break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}
}

运行结果:

该图片无法显示!

4.获取多个触控点的坐标

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;public class MainActivity extends AppCompatActivity {private FrameLayout container;private ImageView imv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);imv = (ImageView) findViewById(R.id.imv);container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE://System.out.println(String.format("(%f,%f)",motionEvent.getX(),motionEvent.getY()));System.out.println("pointers count:"+motionEvent.getPointerCount());  //get the number of pointers
System.out.println(String.format("point1:(%f,%f)  point2:(%f,%f)",motionEvent.getX(0),motionEvent.getY(0),motionEvent.getX(1),motionEvent.getY(1)));//when you put just one finger on the screen,there will be a exception,because there is not a getX(1).break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}

输出结果:

07-13 14:54:52.855 5804-5804/bhu.com.myapplication I/System.out: point1:(245.296295,718.407410)  point2:(456.000000,389.000000)
07-13 14:54:52.865 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.865 5804-5804/bhu.com.myapplication I/System.out: point1:(244.000000,721.000000)  point2:(455.000000,392.000000)
07-13 14:54:52.885 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.885 5804-5804/bhu.com.myapplication I/System.out: point1:(242.387100,722.612915)  point2:(454.000000,394.000000)
07-13 14:54:52.895 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.905 5804-5804/bhu.com.myapplication I/System.out: point1:(242.000000,724.000000)  point2:(453.000000,396.000000)
07-13 14:54:52.915 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.915 5804-5804/bhu.com.myapplication I/System.out: point1:(241.000000,724.000000)  point2:(452.000000,397.000000)
07-13 14:54:52.935 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.935 5804-5804/bhu.com.myapplication I/System.out: point1:(241.000000,725.000000)  point2:(452.000000,397.000000)

5.根据手势动作实现图片的缩放(两点触控)<并且可以拖动>

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;public class MainActivity extends AppCompatActivity {private FrameLayout container;private ImageView imv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);imv = (ImageView) findViewById(R.id.imv);container.setOnTouchListener(new View.OnTouchListener() {float cureentDistance;float lastDistance = -1; //the distance of two point can not be a minus,when the distance is -1 ,it means it's a initial value.
@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()) {case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE:if (motionEvent.getPointerCount() >= 2) {//there must be two finger on the screenfloat offsetX = motionEvent.getX(0) - motionEvent.getX(1);float offsetY = motionEvent.getY(1) - motionEvent.getY(1);cureentDistance = (float) Math.sqrt(offsetX * offsetX + offsetY * offsetY);if (lastDistance < 0) {lastDistance = cureentDistance;} else {if (cureentDistance - lastDistance > 5) {System.out.println("Zoom in");FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();lp.width = (int) (1.1f*imv.getWidth());lp.height = (int) (1.1f*imv.getHeight());imv.setLayoutParams(lp);lastDistance = cureentDistance;} else if (lastDistance - cureentDistance > 5) {System.out.println("Zoom out");FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();lp.width = (int) (0.9f*imv.getWidth());lp.height = (int) (0.9f*imv.getHeight());imv.setLayoutParams(lp);lastDistance = cureentDistance;}}}else{FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();lp.leftMargin = (int) (motionEvent.getX()-(imv.getWidth()/2));lp.topMargin = (int) (motionEvent.getY()-(imv.getHeight()/2));imv.setLayoutParams(lp);}break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}}

 

转载于:https://www.cnblogs.com/androidNot/p/5667051.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:网络设备知识笔记

网络设备是实现计算机网络实现用户通信和交互信息的硬件基础。常用的网络设备有中继器、网桥、路由器、集线器等。 1、网络传输介质互联设备 网络线路和用户节点具体衔接时&#xff0c;需要网络传输介质的互联设备。比如T型头&#xff08;同轴电缆连接器&#xff09;、收发器、…

执行git命令时提示秘钥权限太开放‘Permissions 0644 for ‘/Users/liuml/.ssh/id_rsa_tz‘ are too open.’

执行git命令时提示秘钥权限太开放‘Permissions 0644 for /Users/liuml/.ssh/id_rsa_tz are too open.’ 报错如下 这个问题是由于 权限的问题&#xff0c;需要文件设置权限&#xff1a; chmod 600 *

eclipse折叠if语句块_Python学习日志01判断 if 语句

1.条件判断语句&#xff08;if语句&#xff09;在python中&#xff0c;if语句就是用来进行判断的&#xff0c;语法如下&#xff1a;语法&#xff1a;If 条件表达式&#xff1a;代码块执行的流程&#xff1a;if语句在执行时&#xff0c;会先对条件表达式进行求值判断&#xff1b…

mysql怎么可视化连接_IDEA连接MySQL可视化工具连接操作

IDEA连接MySQL可视化工具连接操作入下所示&#xff1a;填写完成后&#xff0c;点击测试连接&#xff0c;连接成功如图所示点击OK即可报告错误(如图所示)&#xff1a;[08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. java.ne…

Windows下图文详解PHP三种运行方式(php_mod、cgi、fastcgi)

PHP能不能成功的在Apache服务器上运行&#xff0c;就看我们如何去配置PHP的运行方式。PHP运行目前为止主要有三种方式&#xff1a; a、以模块加载的方式运行&#xff0c;初学者可能不容易理解&#xff0c;其实就是将PHP集成到Apache服务器&#xff0c;以同一个进程运行。 b、以…

计算机网络基础:ISO/OSI网络体系结构知识笔记​

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

mac下安装redis

官网地址&#xff1a;https://redis.io/ 二、下载完成后解压安装 解压命令 tar zxvf redis-6.0.6.tar.gz 切换到redis目录下 cd redis-6.0.6 编译测试 sudo make test 编译安装 sudo make install sudo make test sudo make install

mysql having和where_浅谈Mysql中where和having的区别

一、误区&#xff1a;不要错误的认为having和group by 必须配合使用.二、where和having用法解析&#xff1a;1、 where和having都可以使用的场景&#xff1a;select goods_price,goods_name from goods where goods_price > 100select goods_price,goods_name from goods ha…

ds证据理论python实现_ALI模型理论以及Python实现

https://openreview.net/forum?idB1ElR4cgg模型结构和明天要发BiGAN模型一模一样&#xff0c;但是两篇论文的作者都是独立完成自己的内容的。而且从写作的风格来看emmm完全不一样ALI跟BiGAN的设计一模一样&#xff0c;但是就是没有加Latent regressor。虽然在ALI中也简要地谈到…

IO操作总结

1&#xff0c;读取文件将文件转换为二进制流 1 InputStream in new FileInputStream("C:/test.png"); 2 byte[] photo new byte[in.available()]; 3 in.read(photo); 4 in.close(); View Code2&#xff0c;写文件 1 Outpu…

计算机网络基础:网络标准相关知识介绍

1、常见的制定网络标准的机构 国际标准化组织、国际电信联盟、电子工业协会、电气和电子工程协会、因特网活动委员会 2、常见的网络标准 2.1 电信标准 国际电信联盟&#xff08;ITU&#xff09;1947年成为联合国的一个组织&#xff0c;包括ITU-R、ITU-T、ITU-D组成。 ITU-R:无线…

Long类型转为String类型

如果java返回给前端的字段有Long类型的&#xff0c;比如主键id&#xff0c;那么就要把这个Long类型转为String类型才可以&#xff0c;不然前端拿到这个字段再传回给你后端用的时候会导致精度缺失&#xff0c;也就是这个字段的值会改变&#xff0c;原因是java的Long类型是18位&a…

1-5Tomcat 目录结构 和 web项目目录结构

对应我的安装路径&#xff1a; web项目目录结构 转载于:https://www.cnblogs.com/huiziz/p/5671612.html

execjs执行js出现window对象未定义时的解决_10个常见的JS语言错误总汇

1、 Uncaught TypeError: Cannot Read Property这是 JavaScript 开发人员最常遇到的错误。当你读取一个属性或调用一个未定义对象的方法时&#xff0c;Chrome 中就会报出这样的错误。导致这个错误发生的原因有很多&#xff0c;常见的一种情况是在渲染 UI 组件时&#xff0c;不正…

安卓logcat工具apk_backdoorapk 安卓APK后门捆绑脚本

项目地址https://github.com/dana-at-cp/backdoor-apk项目介绍backdoor-apk是一个bash写的脚本&#xff0c;通过msfvenom生成一个android的payload&#xff0c;然后再使用apktools将payload捆绑到正常的apk文件中。使用方法rootkali:~/Android/evol-lab/BaiduBrowserRat# ./bac…

java8 supplier 接口

Supplier 接口 Supplier 接口是一个供给型的接口&#xff0c;其实&#xff0c;说白了就是一个容器&#xff0c;可以用来存储数据&#xff0c;然后可以供其他方法使用的这么一个接口 *** Supplier接口测试&#xff0c;supplier相当一个容器或者变量&#xff0c;可以存储值*/Tes…

mantis apache mysql_软件测试(软件安装:php+mysql+apache+mantis过程遇到的问题以及解决方法)...

实验环境&#xff1a; Windows 7 64位操作系统浏览器版本: Mozilla Firefox 41.0.0.5378一&#xff0e;PHP的安装① 版本: php-5.4.45-Win32-VC9-x86安装步骤&#xff1a;安装将PHP安装到 D:\PHP下(目录可以自行更改)配置找到PHP目录里的类似 php.ini-dist &#xff0c;…

c#程序中使用like“查询access数据库查询为空的问题

今天&#xff0c;在开发的过程中发现了一个特别奇怪的问题&#xff1a;access中like查询时候&#xff0c;在Access数据库中执行&#xff0c;发现可以查询出结果&#xff0c;这是在数据库上执行&#xff0c;select * from KPProj where KpName like *测试*&#xff0c;但是同样的…

html登录界面_使用数据库制作一套注册登录系统

经过了那么多个星期的学习&#xff0c;终于到了使用数据库的阶段了&#xff0c;最基本的也就是制作注册登录与数据库连接。首先要制作一个注册窗口先是html界面<效果如图&#xff1a;&#xff08;样子怎么样不重要&#xff0c;重要的是测试&#xff09;这主要是将form数值发…

java8中Predicate用法

Predicate是个断言式接口其参数是<T,boolean>&#xff0c;也就是给一个参数T&#xff0c;返回boolean类型的结果。跟Function一样&#xff0c;Predicate的具体实现也是根据传入的lambda表达式来决定的。 Testpublic void predicate(){/*** Predicate谓词测试&#xff0c…