Android项目---TouchListener
public static interface
View.OnTouchListener
| android.view.View.OnTouchListener |
Known Indirect Subclasses
|
Class Overview
Interface definition for a callback to be invoked when a touch event is dispatched to this view. The callback will be invoked before the touch event is given to the view.
Summary
| Public Methods | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| abstract boolean | onTouch(View v, MotionEvent event)
Called when a touch event is dispatched to a view.
|
||||||||||
用到这个类,一般就是在Android项目中,获取手点击屏幕的焦点。
如果实在控件上操作的话,一般将TouchListener事件单独提出来,写成一个工具类。
一、定义TouchListener工具类
public class TouchListener implements OnTouchListener {
Context context;
float oldDist;
float newDist;
float oldY;
float newY;
List<Float> list = new ArrayList<Float>();
boolean on_off;
public TouchListener(Context context) {
this.context = context;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
float f2 = event.getRawX();
list.add(f2);
oldDist = list.get();// 存集合里 又因为onTouch方法会不断会掉 这个值会不断加入集合中
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
System.out.println("DOWN");
oldY = event.getY();
break;
case MotionEvent.ACTION_UP:
System.out.println("UP");
newDist = event.getRawX();
if (oldDist < && newDist - oldDist > ) {
Intent intent = new Intent();
intent.setAction("open");
context.sendBroadcast(intent);
HomeActivity.isopen = true;
}
if (newDist - oldDist < -
|| (newDist - oldDist > && newDist - oldDist < && oldDist < )) {
Intent intent = new Intent();
intent.setAction("back");
context.sendBroadcast(intent);
}
if (newDist - oldDist < && newDist - oldDist > -
&& HomeActivity.isopen) {
Intent intent = new Intent();
intent.setAction("open");
context.sendBroadcast(intent);
HomeActivity.isopen = true;
} else {
list = new ArrayList<Float>();
newY = event.getY();
if (Math.abs(newY - oldY) <
&& Math.abs(newDist - oldDist) > ) {return true;
} else {return false;
}
}
break;
case MotionEvent.ACTION_MOVE:
System.out.println("MOVE");
newDist = event.getRawX();
float distance = newDist - oldDist;
Intent intent = new Intent();
intent.putExtra("distance", distance);
intent.putExtra("old", oldDist);
intent.setAction("move");
context.sendBroadcast(intent);
Log.i("info", "MOVE");
break;
}
return true;
}
}
注:一定要给每个case写break。。。
ACTION_MASK在Android中是应用于多点触摸操作,字面上的意思大概是动作掩码的意思吧。
在onTouchEvent(MotionEvent event)中
使用switch (event.getAction())可以处理ACTION_DOWN和ACTION_UP事件
使用switch (event.getAction() & MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。
ACTION_DOWN和ACTION_UP就是单点触摸屏幕,按下去和放开的操作;
ACTION_POINTER_DOWN和ACTION_POINTER_UP就是多点触摸屏幕,当有一只手指按下去的时候,另一只手指按下和放开的动作捕捉;
ACTION_MOVE就是手指在屏幕上移动的操作;
TouchListener中有一个问题,在重写onTouch方法的时候,返回值false和true的不同。
如果是false,则出了按钮控件会正常显示down,up,move的值,其他控件都只能显示down的事件
如果是true,则就会不断的取值。
event.getX();//指的是控件的x坐标
event.getRawX();//指的是屏幕的X坐标
二、接收广播
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("open")) {
new AsyncMove2().execute();
}
if (intent.getAction().equals("back")) {
isopen = false;
new AsyncMove2().execute();
}
if (intent.getAction().equals("move")) {
float f = intent.getFloatExtra("distance", );
float old = intent.getFloatExtra("old", );
LinearLayout.LayoutParams lp = (LayoutParams) left_menu
.getLayoutParams();
if (isopen && f < ) {
lp.leftMargin = (int) f;
} else if (!isopen && f > && old < ) {
lp.leftMargin = (int) (-left_menu.getWidth() + f);
}
left_menu.setLayoutParams(lp);
}
}
};
三、注册广播
IntentFilter inf = new IntentFilter();
inf.addAction("open");
inf.addAction("back");
inf.addAction("move");
registerReceiver(receiver, inf);
关于onTouch事件的算法思想:
获取动作 多点触控
如果是按下
得到按下时控件的Y轴值
如果是抬起
获取手指抬起时获得的屏幕新的X的值
如果手指按下的位置靠近屏幕左边100像素内,并且新位置的值减去旧位置的值大于200(从左向右滑动)
打开菜单栏(向Activity中发送打开广播)
如果新位置值减去旧位置值小于200(从右向左滑动)或者<新旧位置值差值大于0 并且新减旧小于200(从左向右滑动距离太短)并且是在距离屏幕100像素内>
关闭菜单栏(向Activity中发送关闭广播)
如果现在菜单是打开着的并且是从右向左滑动 且滑动距离很短(小于200) 则将菜单重新弹出
打开菜单栏
否则如果控件Y轴的变化大于50就认为他是要上下滑动listview不去执行左右开关操作
如果手势是弧形 且弧形平缓就理解为是左右滑动
打开菜单
如果手势是弧形 且弧形陡峭就理解为是上下滑动 不在执行打开关闭菜单操作 认为用户是在滑动listview
关闭菜单
如果是移动
获取屏幕的x值
获取移动的距离
发送广播
Android项目---TouchListener的更多相关文章
- Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决
在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...
- eclipse — 导入android项目后识别成java项目的问题及解决
最近在eclipse导入android项目的时候遇到了奇葩问题,再此记录 遇到的问题就是:将完好的android项目导入到eclipse的时候,原本这是一个很容易的事情,但是导入成功后发现,,,靠ec ...
- 用Kotlin创建第一个Android项目(KAD 01)
原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...
- Android之什么是Activity和常用的ADB命令以及Android项目结构的认识
总结一下之前学习Android的一些内容 一: Android常用的ADB命令(adb android调试桥) 1.adb devices 查看模拟器设备并重新连接. 2.adb ki ...
- eclipse将android项目生成apk并且给apk签名
转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...
- Android开发学习——Android项目的目录结构
Android项目的目录结构: 资源文件夹: 清单配置文件: Android的四大组件在使用前全部需要在清单文件中配置 <?xml version="1.0" encodin ...
- Android项目实战(二十五):Android studio 混淆+打包+验证是否成功
前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...
- Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中
前言: 关于.jar文件: 平时我们Android项目开发中经常会用到第三方的.jar文件. 其实.jar文件就是一个类似.zip文件的压缩包,里面包含了一些源代码,注意的是.jar不包含资源文件(r ...
- 初次尝试用Kotlin实现Android项目
Kotlin: The Swift of Android 起这个文内标题的原因很简单,就是对Kotlin抱有希望--能使Android的开发更简洁.高效及安全.知道Kotlin是从简书的一篇短文,越来 ...
随机推荐
- oracle数据库全然恢复和不全然恢复以及运行用户管理辈分恢复
比較全然恢复和不全然恢复: 一.全然恢复:将数据库恢复到当前最新状态,包含直至请求恢复时进行的全部已提交的数据更改 二.不全然恢复:将数据库恢复到请求恢复操作之前指定的过去时间点 一.全然恢复过程 以 ...
- MySQL分页实现
mysql> select pname from product; +--------+ | pname | +--------+ | 产品1 | | 产品2 | | 产品三 | +--- ...
- jsp跳转后台代码页的简易方式~
jsp跳转到代码隐藏页.有几种方法,例如,: action方式: jquery方式,码如下面: function regCust(){ $('#containerFRM').form( ...
- hdu 3695 Computer Virus on Planet Pandora(AC自己主动机)
题目连接:hdu 3695 Computer Virus on Planet Pandora 题目大意:给定一些病毒串,要求推断说给定串中包括几个病毒串,包括反转. 解题思路:将给定的字符串展开,然后 ...
- Linux对于录音
一.原理简介 在Linux下,记录--从dsp读取数据.播放--至dsp设备写入数据. 开发板採用声卡UDA1341实现音频编解码,完毕A/D和D/A转换,芯片UDA1341与CPU的连接图例如以下: ...
- Android发展简报
Android这个词的本义是指“机器人”.同时它是Google至2007年11月5根据公布Linux台的开源手机操作系统的名称,该平台由操作系统.中间件.用户界面和应用软件组成.号称是首个为移动终端打 ...
- react.js 从零开始(五)React 中事件的用法
事件系统 虚拟事件对象 事件处理器将会传入虚拟事件对象的实例,一个对浏览器本地事件的跨浏览器封装.它有和浏览器本地事件相同的属性和方法,包括 stopPropagation() 和 prevent ...
- 十天学Linux内核之第二天---进程
原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲 ...
- Crazy Rows
Problem You are given an N x N matrix with 0 and 1 values. You can swap any two adjacent rows of the ...
- 使用CNN(convolutional neural nets)关键的一点是检测到的面部教程(四):学习率,学习潜能,dropout
第七部分 让 学习率 和 学习潜能 随时间的变化 光训练就花了一个小时的时间.等结果并非一个令人心情愉快的事情.这一部分.我们将讨论将两个技巧结合让网络训练的更快! 直觉上的解决的方法是,開始训练时取 ...
Known Indirect Subclasses