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是从简书的一篇短文,越来 ...
随机推荐
- AngularJS 课程
AngularJS 教程(点我) AngularJS 通过新的属性和表达式扩展了 HTML. AngularJS 能够构建一个单一页面应用程序(SPAs:Single Page Application ...
- 《Javascript权威指南》学习笔记之十八:BOM新成就(1)--client存储数据(Web SQL DataBase实现)
使用本地存储和会话存储能够实现简单的对象持久化,能够对简单的键值对或对象进行存储.可是,对于比較复杂的关系数据进行处理时,就要用Web SQL Database.浏览器对Web SQL Databas ...
- mysql 在创建批处理脚本日志表信息
mysql在批处理脚本通过存储过程如下所示创建日志信息表: drop PROCEDURE if EXISTS reqSp; DELIMITER // create procedure reqSp(sT ...
- 我的MYSQL学习心得(五)
原文:我的MYSQL学习心得(五) 我的MYSQL学习心得(五) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...
- VS扩展开发框架
VsSharp:一个VS扩展开发框架(上) 上篇:设计 一.引子 自2008年起开发SSMS插件SqlSharp(er)的过程中,有一天发现多数代码都大同小异,就像这样. Commands2 comm ...
- HDU1253 胜利大逃亡 BFS
胜利大逃亡 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submiss ...
- Win7安装和配置Tigase 5.2server
Win7安装和配置Tigaseserver 笔者:chszs,转载注明. 博客首页:http://blog.csdn.net/chszs 1.下载tigase-server-5.2.0-b3447.e ...
- GCD(1222)Wolf and Rabbit
Problem Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbi ...
- Code Forces 414B 很不错的双手,以促进合规
http://codeforces.com/problemset/problem/414/B 题目挺不错的.留个纪念,活动脑筋不错的题目 #include<iostream> #inclu ...
- HDU 1042 N! 參考代码
HDU 1042 N! 题意:给定整数N(0 ≤ N ≤ 10000), 求 N! (题目链接) #include <iostream> using namespace std; //每一 ...