触摸事件

1) onTouchListener

@Override
public boolean onTouch(View v, MotionEvent event) {int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN: //手指按下break;case MotionEvent.ACTION_MOVE: //手指移动(从手指按下到抬起 move多次执行)break;case MotionEvent.ACTION_UP: //手指抬起break;}return true; //表示消费了触摸事件,onTouch之后才执行onClick,这里被消费了,所以,相关的点击事件不会执行。
}

使用event.getX();event.getY();来获取位置(手指按下,移动或者是抬起时的位置)。通过位置来判断手指滑动的方向。
.

.

简记:down>move 为左上

2) 触摸的边界问题(左右滑动为例)

在左右滑动的过程中,需要对控件进行位置更改的,每一次更改位置,都需要保证将要移动到的位置需要在上面的x变化中,大于或者小于两边的边界值时,就取边界值。

3) onTouch 和onClick

onClick 的过程是手指按下和抬起的过程(中间,手指抖动会产生移动),可以将onClick看做是一种特殊的onTouch。如果onTouch 没有消费掉触摸事件(没有return true),在onTouch后, 紧接着会执行onClick事件;如果onTouch消费掉了触摸事件(return true),后面将不会再执行onClick事件。
需求较为复杂时,不仅需要touch事件也需要点击,甚至是长按事件,可以在onTouch中判断要进行哪一种事件(根据触摸的时间,距离等来判断)。

4) 滑动事件和VelocityTracker 速度跟踪

关于速度,速度是有方向的,往哪边运动。向左(上)滑动所产生的速度是负数,向右(下)滑动所产生的速度是正数。

VelocityTracker 跟踪手指滑动的速度, 怎么跟踪?

VelocityTracker velocityTracker = VelocityTracker.obtain();//获取跟踪类的实例

VelocityTracker(MotionEvent event);
然后就可以通过

velocity.getVelocityX();//获取x轴方向的速度
velocityTracker.getVelocityY();//获取y轴方向的速度

什么时候需要速度跟踪?
根据用户手指操作的速度来进行某些操作时,需要进行速度跟踪。例如,对slidMenu的操作,手指可能并没有滑动到显示menu的一半(往显示menu的方向进行滑动),但是,如果我滑动的速度很快,那么此时还是应该显示menu界面。


代码练习:
基于
郭霖–
Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
http://blog.csdn.net/guolin_blog/article/details/8714621

侧滑的简单实现思路:
界面本身是一个水平的LinearLayout布局文件,有menu+content两个(LinearLayout)控件,通过设置LL的margin来设置menu不可见。然后,通过手指的左右滑动,设置margin左右变化来显示内容,使用Velocity记录滑动过程的速度,当手指停止滑动时,根据手指抬起来的位置以及速度来判断menu是否完全显示,还是完全隐藏。

个人编码实现 onTouch部分:

@Overridepublic boolean onTouch(View v, MotionEvent event) {int action = event.getAction();velocityTracker.addMovement(event);//将当前事件添加到速度跟踪类 进行速度的跟踪//主要设置 手指的左右滑动switch (action) {case MotionEvent.ACTION_DOWN:mFirstDownX = event.getX();mDownX = event.getX();break;case MotionEvent.ACTION_MOVE:float mMoveX = event.getX();float dx = Math.abs(mDownX - mMoveX);//1、根据move的位置,判断用户手指是往哪边滑动的float mMarginX = mMenuParams.leftMargin;if (mMoveX < mDownX) {//向左滑//左滑的条件是否满足if (mMarginX <= 0 && mMarginX > -mMenuWidth) {mMarginX = mMarginX - dx;}} else {//向右滑if (mMarginX < 0 && mMarginX >= -mMenuWidth) {mMarginX = mMarginX + dx;}}//保证 menu 的leftMargin 在-mMenuWidth-->0 这个范围之间mMarginX = mMarginX >= 0 ? 0 : mMarginX;mMarginX = mMarginX <= -mMenuWidth ? -mMenuWidth : mMarginX;mMenuParams.leftMargin = (int) mMarginX;llMenu.setLayoutParams(mMenuParams);mDownX = mMoveX;//更新手指按下的位置break;case MotionEvent.ACTION_UP:float upX = event.getX();//要实现什么样的效果?//手指停止的时候,界面滑动到某个位置,根据这个位置来判断是否显示menu//手指停止的位置,手指滑动的方向来确定后续操作。//根据down的位置和up的位置可以判断方向,根据leftMargin来判断位置velocityTracker.computeCurrentVelocity(1000);//计算移动float xVelocity = Math.abs(velocityTracker.getXVelocity());int leftMargin = mMenuParams.leftMargin;int leftMarginABS = Math.abs(leftMargin);Log.e("MainActivity", "xVelocity=" + xVelocity);if (mFirstDownX > upX && leftMargin <= 0 && leftMargin > -mMenuWidth) {//左滑  并且能够进行左滑if (leftMarginABS > mMenuWidth / 2 || xVelocity > maxVelocity) {//左边显示的过多Log.e("MainActivity", "左滑 xVelocity > maxVelocity=" + (xVelocity > maxVelocity));showContent();} else if (leftMarginABS < mMenuWidth / 2) {showMenu();}} else {//右滑if (mFirstDownX < upX && leftMargin < 0 && leftMargin >= -mMenuWidth) {//保证能进行右滑if (leftMarginABS <= mMenuWidth / 2 || xVelocity > maxVelocity) {//左边显示的少Log.e("MainActivity", "右滑 xVelocity > maxVelocity=" + (xVelocity > maxVelocity));showMenu();} else if (leftMarginABS > mMenuWidth / 2) {showContent();}}}break;}return true;}

最终效果:

【Touch】触摸事件onTouch相关推荐

  1. touch触摸事件以及常用触摸功能

    文章目录 前言 一.触摸事件 二. 事件对象 event 三. 功能案例 1. 检测滑动方向 2. 实现元素拖拽 3. 实现元素旋转 总结 前言 为了给基于触摸的用户界面提供高质量的支持,触摸事件提供 ...

  2. Cocos2d-x处理Touch触摸事件Demo

    请参考<Ubuntu18.04搭建Cocos2d开发环境>搭建项目 默认情况下,Cocos2d-x会将鼠标左点击当作触摸. 第一步:在/home/kyun/Desktop/Games/My ...

  3. HTML5滑动(swipe)事件,移动端触摸(touch)事件

    目有个交互需要实现手指滑动的交互,pc端使用mousedown,mousemove,mouseup监听实现. 但在ios设备上mousemove是不好监听的,同类的方法是touchstart,touc ...

  4. android方向触摸事件,Android触摸事件如何传递?

    慕工程0101907 让我们看一个视觉示例.在此处输入图片说明发生触摸事件时,首先会向每个人通知该事件,从活动开始,一直到顶部的视图.然后,每个人都有机会处理该事件,从顶部的视图(触摸区域中Z顺序最高 ...

  5. 为了讲清楚Android触摸事件,我“拆了部手机”

    Android 是一个有用户界面(GUI)的操作系统,在它诞生之初,就是为带有触摸屏的手持设备准备的.作为提供给用户最重要的交互方式之一,了解触摸系统是怎么工作的,对于实际的项目开发有着非常大的帮助. ...

  6. Android 触摸事件(Touch)的传递机制

    Touch 事件的传递机制 一个完整的touch 事件,由一个 down 事件.n 个 move 事件,一个 up 事件组成. Touch 事 件 一 般 的 传 递 流 程 Activity--&g ...

  7. iOS UITouch触摸与UIGesture手势.01.事件、触摸(touch)事件

    一.iOS事件: 1.事件:事件就是当你在手机上点击手机屏幕.滑动手机翻面.摇动手机的时候,手机做出一些反应,对应的在应用程序里实现了某些代码的某些功能,完成这个过程就是一个事件. 2.iOS事件类型 ...

  8. 移动端事件--touch事件的分类、touch事件的event对象、 其他触摸事件

    一.touch事件的分类 1.1 触摸事件(touch) .box {width: 150px;height: 150px;background-color: red;margin: 20px aut ...

  9. JS事件监听手机屏幕触摸事件 Touch

    JS移动客户端--触屏滑动事件 移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的t ...

最新文章

  1. 2021全国高校计算机能力挑战赛(初赛)C语言
  2. Android开发之底部导航栏标准
  3. 消息称微软计划收购GitHub,估值超50亿美元
  4. 基于 Python 自建分布式高并发 RPC 服务
  5. Python四大金刚之四:集合
  6. [Swift]LeetCode288. 唯一单词缩写 $ Unique Word Abbreviation
  7. 前途,路应该怎么走?
  8. android javamail获取邮件太多太慢_「Java」 - SpringBoot amp; 邮件发送
  9. 【易实战】Spring Cloud Greenwich Hystrix:服务容错保护
  10. cass打开dwg文件无效_DWG文件软件打开显示图形文件无效
  11. Python_Number类及容器类基本数据类型
  12. 20175212童皓桢 实验五 网络编程与安全
  13. 用JavaBean封装数据库操作
  14. 【2019/07/20测试 T2】切题
  15. Linux下代理服务器(proxy)配置
  16. 网络编程与分布式系统
  17. 中国威客发展的5种新模式
  18. Android音频简介
  19. 锐捷SNMP配置实例
  20. 网站配色,CSS主色调配色方案

热门文章

  1. Spark学习(6)-Spark SQL
  2. 爬取电影《无双》影评数据,分析,可视化
  3. 不能打开淘宝单个商品页面
  4. 科研试剂Norbornene-5-TAMRA,降冰片烯-5-羧基四甲基罗丹明
  5. 乓乓响再次冲刺香港上市,黄建义、张卫平夫妇套现约2130万元
  6. 人人都有发言权的新媒体时代 内容审核需亮剑
  7. 瓦伦达心态——再谈工作中的专注和心态
  8. 2016程序员你该爆发洪荒之力了!八招教你成功
  9. Turbo Autoencoder: Deep learning based channel code for point-to-point communication channels
  10. CSS 用图片实现圆角方框(一张图片吆)