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的更多相关文章

  1. Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决

    在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...

  2. eclipse — 导入android项目后识别成java项目的问题及解决

    最近在eclipse导入android项目的时候遇到了奇葩问题,再此记录 遇到的问题就是:将完好的android项目导入到eclipse的时候,原本这是一个很容易的事情,但是导入成功后发现,,,靠ec ...

  3. 用Kotlin创建第一个Android项目(KAD 01)

    原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...

  4. Android之什么是Activity和常用的ADB命令以及Android项目结构的认识

    总结一下之前学习Android的一些内容 一:  Android常用的ADB命令(adb android调试桥)      1.adb devices   查看模拟器设备并重新连接. 2.adb ki ...

  5. eclipse将android项目生成apk并且给apk签名

    转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...

  6. Android开发学习——Android项目的目录结构

    Android项目的目录结构: 资源文件夹: 清单配置文件: Android的四大组件在使用前全部需要在清单文件中配置 <?xml version="1.0" encodin ...

  7. Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

    前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...

  8. Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中

    前言: 关于.jar文件: 平时我们Android项目开发中经常会用到第三方的.jar文件. 其实.jar文件就是一个类似.zip文件的压缩包,里面包含了一些源代码,注意的是.jar不包含资源文件(r ...

  9. 初次尝试用Kotlin实现Android项目

    Kotlin: The Swift of Android 起这个文内标题的原因很简单,就是对Kotlin抱有希望--能使Android的开发更简洁.高效及安全.知道Kotlin是从简书的一篇短文,越来 ...

随机推荐

  1. C/C++基础笔试题1.1.2(十问解决方案运营商)

    他写在博客上不负责任,有人踩在上面,原因一点点失去了它. 其实纯常见问题.特别糟糕,由于鲍文看起来很大的优势就是想更直接看到的东西. 好了.返回整个标题. 1.你脑海中的运算符有哪些.按优先级排个序? ...

  2. Tigase XMPP Server在CentOS部署和配置

    Tigase XMPP Server在CentOS部署与配置 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 以下讲述Tigase XMPP Server ...

  3. OBIEE SampleAppv406 自己主动启动配置

    SampleApp 一个简短的引论: SampleApp这是一个一站式服务,几乎证明OBIEE不管顶的特征可想而知. 它安装了大量的应用(数据库,OBIEE,的Endeca.TimesTen的.Ess ...

  4. 使用 CodeIgniter 框架快速开发 PHP 应用(五)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(五) 简化 HTML 页面和表格设计这一章介绍了又一个节约你的时间而且使你的代码更具安全性和逻辑性的领域.第一,我们将会介绍创建视图的各 ...

  5. 【C++模版之旅】项目中一次活用C++模板(traits)的经历

    曾经曾在一个项目中碰到过一个挺简单的问题,但一时又不能用普通常规的方法去非常好的解决,最后通过C++模板的活用,通过traits相对照较巧妙的攻克了这个问题.本文主要想重现问题发生,若干解决方式的比較 ...

  6. hdu Text Reverse

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1062 单词翻转! 代码: #include <stdio.h> #include < ...

  7. Web前端开发实用的Chrome插件

    Web前端开发实用的Chrome插件 越来越多的前端开发人员喜欢在Chrome里开发调试代码,Chrome有许多优秀的插件可以帮助前端开发人员极大的提高工作效率.尤其Chrome本身是可以登录的,登录 ...

  8. 浅谈 IE下innerHTML导致的问题

    原文:浅谈 IE下innerHTML导致的问题 先来看个demo吧: <!DOCTYPE html> <html> <head> <meta charset= ...

  9. WebView无法放大缩小解决方式

    先看看我们之前所写的代码 1) 加入权限:AndroidManifest.xml中必须使用了许可"android.permission.INTERNET" 2) 使用了一个WebV ...

  10. hbase ganglia监控配置

    hbase ganglia 显示器 hbase 构造 hadoop-metrics2-hbase.properties *.sink.ganglia.class=org.apache.hadoop.m ...