android touch事件坐标原点,Android onTouch事件与手势操作
触摸,手势操作已经很好的融入了我们的生活。那么Android开发中触摸事件要如何捕捉?如何处理?如何识别手势?事件的传递机制又是怎么样的?下面我们将通过一个小例子来进行这方面的学习。
先看效果图
如上图所示,就是一个跟随手指移动的按钮。用来演示我们接下来要说的onTouch事件和手势操作。
为了让大家看懂里面的代码,我们来先介绍一下基础知识。
onTouch事件
做什么都好先了解原理以后的工作就会更简单,关于手势以及我们熟悉的onclick,
onLongClick事件都是基于对onTouch事件的捕捉和处理。那么在使用手势工具类的前提下我们应该去学习了解基本的onTouch事件。
onTouch常用的以下4个事件:
1、ACTION_DOWN:
表示按下了屏幕,第一个执行也是必然执行的方法。
2、ACTION_MOVE:
表示为移动手势,会不断的执行直到触摸停止。
3、ACTION_UP:
表示为离开屏幕,触摸停止的时候执行。
4、ACTION_CANCEL:
表示取消手势,不会由用户产生,而是由程序产生的。
一个Action_DOWN,多个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多的事件。
onTouch的参数
View
受到Touch事件的view对象
MotionEvent
包含的事件的详细信息,例如触摸点的信息,触摸事件类型的信息等
MotionEvent的方法例如getRowX所描述的都是触摸点的信息。
几个重要方法的说明:
getRowX:触摸点相对于屏幕的坐标
getX: 触摸点相对于view的坐标
getTop: 按钮左上角相对于父view(LinerLayout)的y坐标
getLeft: 按钮左上角相对于父view(LinerLayout)的x坐标
onTouch的返回值
这个部分涉及到事件传递和处理机制,详细的不在此介绍。
作用:
这里的返回值代表的是,对于这个触摸事件touch是否已经处理完成。
如果我们设置返回值为true代表的是处理完成,这样就不会再传递给下一个对象。也就是说后面的控件或者对象就不会接收到触摸事件了。
反之,后面的对象或控件会在此接收到这个触摸事件并被调用。
实践
在学习基础知识之后,我们来看看如何使用这些来实现一个可以拖动的按钮吧。
思路
这里的主要思路就是在ACTION_DOWN按下的第一时间记录下初始的状态,在ACTION_MOVE滑动事件中不断的刷新按钮的位置。
为了保证有我们正常理解下的点击事件发生,下面我还加了位置是否移动的判断。
下面是实现该功能的内部类class MyOnTouch implements OnTouchListener{
int[] temp = new int[] { 0, 0 };
Boolean ismove = false;
int downX = 0;
int downY = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
int eventaction = event.getAction();
int x = (int) event.getRawX();
int y = (int) event.getRawY();
switch (eventaction) {
case MotionEvent.ACTION_DOWN: // touch down so check if the
temp[0] = (int) event.getX();
temp[1] = y - v.getTop();
downX = (int) event.getRawX();
downY = (int) event.getRawY();
ismove = false;
break;
case MotionEvent.ACTION_MOVE: // touch drag with the ball
v.layout(x - temp[0], y - temp[1], x + v.getWidth() - temp[0], y - temp[1] + v.getHeight());
if (Math.abs(downX - x) > 10 || Math.abs(downY - y) > 10)
ismove = true;
break;
case MotionEvent.ACTION_UP:
if (!ismove)
Toast.makeText(MainActivity.this, "你点击了这个按钮", Toast.LENGTH_LONG).show();
break;
}
return false;
}
}
然后在给按钮初始化的时候设置这个事件touchButton.setOnTouchListener(new MyOnTouch());
手势操作
关于手势操作,这里其实说的是Android提供的工具类,通过GestureDetector类来识别和处理onTouch事件,简化使用。
一般用到下面的三个类。
android.view.GestureDetector
手势操作的识别类,通过他来使用下面的识别接口。
android.view.GestureDetector.SimpleOnGestureListener
手势识别的接口类,使用他可以按需重载自己想要的方法,方法多
android.view.GestureDetector.OnGestureListener;
手势识别的类,SimpleOnGestureListener接口的父类。使用他需要实现他所有的方法。
方法说明:
OnGestureListener有下面的几个方法:
按下(onDown):
在按下时调用。
抛掷(onFling):
手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress):
手指按在持续一段时间,并且没有松开。
滚动(onScroll):
手指在触摸屏上滑动。
按住(onShowPress):
手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):
手指离开触摸屏的那一刹那。
SimpleOnGestureListener比OnGestureListener多出来的方法:
双击(onDoubleTap)
双击的第二下Touch down时触发
双击事件(onDoubleTapEvent)
双击的第二下Touch down和up都会触发一次,可用e.getAction()区分。
实践
好了,学习完了基础知识之后我们来用手势操作的工具类来实现我们的小按钮吧。
下面来实现我们的手势操作内部类。这里我直接实现了OnGestureListener接口,为了更好的演示效果。class MyGesture implements OnTouchListener, OnGestureListener {
GestureDetector myGesture = new GestureDetector(MainActivity.this,this);
View view = null;
int[] temp = new int[] { 0, 0 };
@Override
public boolean onTouch(View v, MotionEvent event) {
//这一步只是我的强迫症而已,因为onTouch事件是不断被调用的
if(view == null)
view = v;
myGesture.onTouchEvent(event);
return false;
}
//在按下时调用
@Override
public boolean onDown(MotionEvent e) {
temp[0] = (int) e.getX();
temp[1] = ((int) e.getRawY()) - view.getTop();
return false;
}
//手指在触摸屏上迅速移动,并松开的动作。
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;
}
//长按的时候调用
@Override
public void onLongPress(MotionEvent e) {
}
//按住然后滑动时调用
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
int x = (int) e2.getRawX();
int y = (int) e2.getRawY();
view.layout(x - temp[0], y - temp[1], x + view.getWidth() - temp[0], y - temp[1] + view.getHeight());
return false;
}
// 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
// 注意和onDown()的区别,强调的是没有松开或者拖动的状态
@Override
public void onShowPress(MotionEvent e) {
}
// 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
@Override
public boolean onSingleTapUp(MotionEvent e) {
Toast.makeText(MainActivity.this, "你点击了按钮", Toast.LENGTH_LONG).show();
return false;
}
}
然后在使用的时候给我们的按钮设置进去就好了touchButton.setOnTouchListener(new MyGesture());
在内部类的开头初始化我们的GestureDetector处理类GestureDetector myGesture = new GestureDetector(MainActivity.this,this);
在onTouch方法中调用GestureDetector的方法myGesture.onTouchEvent(event);
关于按钮功能的说明:
可以拖动的按钮,这个功能的核心代码是v.layout(x - temp[0], y - temp[1], x + v.getWidth() - temp[0], y - temp[1] + v.getHeight());
在滑动事件中调用view.layout(int l, int t, int r, int b)
android touch事件坐标原点,Android onTouch事件与手势操作相关推荐
- android touch事件坐标原点,Android – 捏缩放ontouch事件坐标
我正在尝试获取我正在创建的 Android应用程序的画布坐标.它很有用,直到我添加代码以使用缩放焦点(以下两行): scalePoint.setX((int) detector.getFocusX() ...
- android 屏幕中心坐标原点,Android 的坐标系及矩阵变换
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android的坐标系 2D坐标系 android的2d坐标系如图所示,水平向右为X轴正方向,竖直向下为Y轴正方向,原点 ...
- android touch事件坐标原点,图解Android:Touch事件传递机制
前言 Android事件管理机制是一名专业Android研发工程师必须要了解的核心知识之一,深入了解一下该机制无论对我们日常开发还是找工作,乃至于对我们的架构思想都有很大的帮助.Android中我们用 ...
- android 模拟gps坐标,1020. Android GPS定位欺骗(模拟定位)的3类途径4种方式
前段时间发布的手游PokemonGo相信大家都有耳闻,而因为这个游戏在国内的坐标遭到了封锁,很多科学游戏方法也陆续涌现.好不热闹. 那其实,PokemonGo最初的版本,在大陆是可以通过简单的vpn+ ...
- android studio按坐标布局,Android studio一个手势锁的界面布局
目的:完成一个手势锁的界面布局,对Relative,Contains等布局进行简单的使用,onWindowFocusChanged进行一定的熟练.大概来说,就是增加对界面布局的了解. 技术:(1)简单 ...
- android地图获取坐标位置,android 百度地图 根据得到的经纬度 获取位置信息
满意答案 回复了sfdzyy 2015.07.03 采纳率:57% 等级:7 已帮助:658人 private GeoCoder mSearch = null; // 搜索模块 // 初始化搜索 ...
- android onclick事件和ontouch事件发生先后顺序和关联
Button的onTouch,onClick,onLongClick事件发生先后顺序和关联: 一,onTouch返回false 首先是onTouch事件的down事件发生,此时,如果长按,触发onLo ...
- android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...
本文讲解TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件 Android 事件传递机制:Android 事件传递机制初涉 我们知道 Button ...
- Android Touch事件分发(源码分析)
Android一文让你轻松搞定Touch事件分发 源码分析 下面,咱们一起通过源码,全面解析事件分发机制,即按顺序讲解: Activity事件分发机制 ViewGroup事件分发机制 View事件分发 ...
最新文章
- JDK、JRE、JVM三者间的关系(有图)
- 透過 OpenNI 建立 Kinect 3D Point Cloud
- ASP.NET3种验证码[转]
- .NET Core 集成JWT认证
- iSensor APP 之 摄像头调试 OV3640 OV2640 MT9d112
- lia人是什么意思_69年属鸡人终身灾难是什么意思
- linux驱动开发框架
- 小写字母转大写代码HTML,CSS控制转换字母的大写和小写
- 华为计算机怎么算根号,华为手机计算器的根号是什?
- 马原期末复习知识点完整版!
- linux 系统频率,[求助]Linux中的“超出显示频率范围”问题
- 这位成功转型机器学习的老炮,想把他多年的经验分享给你
- 美团云苏宁云倒下了,他们却顺利突围
- DiscuzX 数据字典 超详细
- ElasticSearch常用插件整理
- win python_winpython_winpython linux_python win - 云+社区 - 腾讯云
- 关于Python虚拟环境与包管理你应该知道的事
- Scalar类-颜色类
- 【数据结构】递归斐波那契数列的时间复杂度、空间复杂度
- linux查看系统版本