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是从简书的一篇短文,越来 ...
随机推荐
- ios7 JavaScriptCore.framework
曾经想要oc调用js代码通常是通过uiwebview的stringByEvaluatingJavaScriptFromString方法,或是直接使用JavaScriptCore引擎,比如https:/ ...
- OBIEE SampleAppv406 自己主动启动配置
SampleApp 一个简短的引论: SampleApp这是一个一站式服务,几乎证明OBIEE不管顶的特征可想而知. 它安装了大量的应用(数据库,OBIEE,的Endeca.TimesTen的.Ess ...
- 我的MYSQL学习心得(六)
原文:我的MYSQL学习心得(六) 我的MYSQL学习心得(六) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...
- javascript活动
在javascript倘若有知识的三个方面.事件的第一,流程,其次,事件处理,第三,事件对象.下面就我个人的理解,,分别讲述一下这三个方面的内容. 第一.事件流 事件流指的是事件依照一定的顺序触发.它 ...
- 面向对象三大特征之多态——Java笔记(七)
多态: 同一个实体同时具有多种形式 编译时的类型有声明该变量时使用的类型决定,运行时的类型有实际赋值给变量的对象决定 如果编译时类型和运行时类型不同,就出现多态 例: clas ...
- Java数据结构与算法(21) - ch09红黑树(RB树)
红-黑规则1. 每一个节点不是红色的就是黑色的2. 根总是黑色的3. 如果节点是红色的,则它的子节点必须是黑色的:如果节点是黑色的,其子节点不是必须为红色.4. 从根到叶节点或空子节点的每条路径,必须 ...
- c#之Async、Await剖析
c#之Async.Await剖析 探索c#之Async.Await剖析 2015-06-15 08:35 by 蘑菇先生, 1429 阅读, 5 评论, 收藏, 编辑 阅读目录: 基本介绍 基本原理剖 ...
- 【Leetcode】Sort List (Sorting)
这个问题需要与归并排序排两个名单,基本思路分为切割与合并 合并后的代码Merge Two Sorted List里已经讲得非常清楚了. 所以这里直接给出代码. public ListNode merg ...
- CodeForces 14 E - Camels && D - Two Paths
D - Two paths 仅仅想到了一个o(n^2)的解法. 首先枚举删除一条边,必定得到两棵独立的树.计算两棵树的直径.保留最大乘积. 首先两条路不相交,则必定能够分到两棵子树中,由于要乘积最大, ...
- UVa 740 - Baudot Data Communication Code
称号:目前编码,他们shift键被按下,并提出,对应的两个编码,其中,2相应的编码shift操作. 给你适当的编码值.寻求相应的字符串. 分析:模拟.字符串. 简单题,标记shift的升降分类处理就可 ...
Known Indirect Subclasses