进阶篇-安卓系统: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
进阶篇-安卓系统:2.多点触控的交互处理相关推荐
- linux多点触摸屏驱动程序,Linux系统实现支持多点触控操作[视频]
虽然大多数人目前还不会购买拥有触控屏的设备,不过在Windows 7的大力推动下,触控操作已经开始流行了起来.然而Linux目前却无法支持这一功能,这让很多用户十分郁闷,不过来自ENAC Intera ...
- 图片的多点触控缩放与移动
整理自 鸿洋大神的慕课网视频 加了很多自己理解的注注释 package MyView; import android.content.Context; import android.graphics. ...
- 【Android】android系统多点触控源码
原文:http://www.linuxidc.com/Linux/2011-10/44305.htm PointerLocation多点触控代码在Android系统源码中的位置分别为: android ...
- 10_10_安卓加linux命令,Scrcpy 1.11版支持Android 10及多点触控手势,附Linux下安装命令...
Scrcpy 1.11版本增加了对Android 10的支持及多点触控手势,现在就可以在Linux系统下安装Scrcpy的更新版本,该工具可让你在PC上镜像Android手机. 更新说明 Scrcpy ...
- Android多点触控详解
本文转载自GcsSloop的 安卓自定义View进阶-多点触控详解 的文章 Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带 ...
- android 单点跟长按的区别,单点触控和多点触控区别是什么?原理分析
描述 导语:触屏手机.平板电脑等新型的智能设备的崛起,除了因为像安卓和ios这样的智能系统诞生的原因外,不可或缺的一个条件就是触摸屏幕的更新换代和多点触控技术的出现.下面我们就来介绍单点触控和多点触控 ...
- Android多点触控之ZoomImageView完全解析
ZoomImageView是一个类似photoview的图片预览控件,实现了对图片的手势放大缩小平移,以及双击放大缩小解决和viewpager滑动冲突等功能,主要是通过GestureDetector, ...
- 真正实现多点触控索尼Xperia Touch试用
现在的科技产品真是层出不穷,没过几天就能看到一次更新,哪里火就全往哪里去,哪个概念火就复制哪个概念,可见有真实力的公司产品不多,更多的是打嘴x的.就像前几天小编参加的一场活动,什么重新发明投影,隔空触 ...
- Iwfu-安卓Gesture手势(2)-实现多点触控控制图片的放大缩小。
上一篇介绍安卓Gesture手势初步使用,这一篇用Gesture来实现多点触控达到控制图片放大缩小. 上文中写道,进行手势监听的Activity要实现对应的OnGestureListener接口,重写 ...
最新文章
- LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化
- shujufenxi : baichi xiangzhuanqian
- custompage.width 不能小数吗_数学启蒙,先学分数还是先学小数?
- 【C基础】指针/指针运算/二级指针/函数指针
- Write a simple HTML Browser(hdu1088)
- 系统软键盘Android在外接物理键盘时,如何强制调用系统软键盘?
- 勤哲excel服务器WEB网页环境搭建问题解决
- MySQL的约束、事务、字符串、日期、数学相关及其他补充
- Hash表的时间复杂度为什么是O(1)?
- javaweb response
- 计算机网络世界(知识扫盲一)
- STM32中断中调用OLED显示出现OLED花屏
- 隐马尔科夫模型 HMM 与 语音识别 speech recognition (1):名词解释
- 【SQL Server】入门教程-基础篇(三)
- 最新研究报告: 坐飞机哪个位置最安全?
- [渝粤教育] 中国地质大学 大学英语(5) 复习题
- 【BZOJ1787】【Ahoi2008】Meet 紧急集合 LCA、双倍经验
- 硬件测试所需的5个流程(硬件开发工程师也应该掌握)
- [附源码]java毕业设计网上购物商城系统
- 笔记 - 会计学原理