




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android实现上下滑动效果1.概念:比如用Scroll手势在浏览器中滚屏,用Fling在阅读器中翻页等。在在Android系统中,手势的识别是通过GestureDetector.OnGestureListener接口来实现的。我们先来明确一些概念:(1)首先:Android的事件处理机制是基于Listener(监听器)来实现的,比我们今天所说的触摸屏相关的事件,就是通过onTouchListener。(2)其次:所有View的子类都可以通过setOnTouchListener()、setOnKeyListener()等方法来添加对某一类事件的监听器。(3)第三:Listener一般会以Interface(接口)的方式来提供,其中包含一个或多个abstract(抽象)方法,我们需要实现这些方法来完成onTouch()、onKey()等等的操作。2.实践:下面我们实现一个手触摸滑动的效果。编写一个类,继承activity实现OnGestureListener接口。publicclassWeightextendsActivityimplementsOnGestureListener privateViewFlipperflipper;privateGestureDetectordetector;protectedvoidonCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);flipper=newViewFlipper(this);detector=newGestureDetector(this);LinearLayout lin =newLinearLayout(this);lin.setLayoutParams(newLinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);lin.setOrientation(LinearLayout.VERTICAL);addTxt(lin);this.addContentView(lin,newViewGroup.LayoutParams(200 ,200);publicvoidaddTxt(ViewGroup view)TextView txt1 =newTextView(this); txt1.setLayoutParams(newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);txt1.setText(11); .txt2和txt3一样设定flipper.addView(txt1);flipper.addView(txt2);flipper.addView(txt3);view.addView(flipper);/*重写GestureDeterctor类里面的onTouchEvent方法*/publicbooleanonTouchEvent(MotionEvent event) Log.i(golf, onTouch);returnthis.detector.onTouchEvent(event); .publicbooleanonFling(MotionEvent e1, MotionEvent e2,floatvelocityX,floatvelocityY) if(e1.getY() e2.getY()this.flipper.showNext();elseif(e1.getY() e2.getY()flipper.showNext();elseif(e1.getY() e2.getY()flipper.showPrevious();elsereturnfalse;returntrue;其他的六个方法比较简单,通过system.out.println()方法看看什么时候调用这个方法。3.升华接下来我们想将这个activity以dialog的形式在其他的activity中显示。先回忆一下我们dialog是如何创建的:Dialogdialog=newAlertDialog.Builder(this).setView(flipper).create();setView(View view)这个参数很灵活。但是自己尝试了各种方法想在dialog实现这种翻页的效果,但是都是失败的。那我们就通过视觉上的欺骗的方法来实现跳出来像dialog的activity。我们新建一个MainActivity,放一个button添加onclickListener事件。事件中的代码:Intentintent =newIntent();intent.setClass(this, Weight.class);startActivity(intent);这样跳转肯定是跳转到新的activity中了,如何实现视觉上的欺骗呢?只需要在申明这个activity中,给Weight添加一个属性:代码如下:Android:theme=”android:style/Theme.Dialog”这个属性就会让Weight乖乖的像dialog一样显示了.用户手势检测-GestureDetector使用详解2014-09-24 11:1626470人阅读评论(13)收藏举报分类:5、andriod开发(145)版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)+前言:今天终于可以正常上班了,阿里的百技真的真的太累了,作为队长,不仅要考虑到每一个人的感受,而且要最大程度地使大家团结起来,共同完成一个任务,四天的时间,14个人的小组完成一个系统,我们队最终是第一个完成的,他们真的很厉害,周六周日都还在加班做,我真的很感动,今天有些同学要坐飞机回京了,很不舍,一周的并肩奋战,使我们一生在一起,小伙伴们,来日再聚!一、概述当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。Androidsdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的。GestureDetector这个类对外提供了两个接口和一个外部类接口:OnGestureListener,OnDoubleTapListener内部类:SimpleOnGestureListener这个外部类,其实是两个接口中所有函数的集成,它包含了这两个接口里所有必须要实现的函数而且都已经重写,但所有方法体都是空的;不同点在于:该类是static class,程序员可以在外部继承这个类,重写里面的手势处理方法。下面我们先看OnGestureListener接口;二、GestureDetector.OnGestureListener-接口1、基本讲解如果我们写一个类并implements OnGestureListener,会提示有几个必须重写的函数,加上之后是这个样子的:javaview plaincopy1. privateclassgesturelistenerimplementsGestureDetector.OnGestureListener2. 3. publicbooleanonDown(MotionEvente)4. /TODOAuto-generatedmethodstub5. returnfalse;6. 7. 8. publicvoidonShowPress(MotionEvente)9. /TODOAuto-generatedmethodstub10. 11. 12. 13. publicbooleanonSingleTapUp(MotionEvente)14. /TODOAuto-generatedmethodstub15. returnfalse;16. 17. 18. publicbooleanonScroll(MotionEvente1,MotionEvente2,19. floatdistanceX,floatdistanceY)20. /TODOAuto-generatedmethodstub21. returnfalse;22. 23. 24. publicvoidonLongPress(MotionEvente)25. /TODOAuto-generatedmethodstub26. 27. 28. 29. publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,30. floatvelocityY)31. /TODOAuto-generatedmethodstub32. returnfalse;33. 34. 35. 可见,这里总共重写了六个函数,这些函数都在什么情况下才会触发呢,下面讲一下:OnDown(MotionEvent e):用户按下屏幕就会触发;onShowPress(MotionEvent e):如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行,具体这个瞬间是多久,我也不清楚呃onLongPress(MotionEvent e):长按触摸屏,超过一定时长,就会触发这个事件 触发顺序: onDown-onShowPress-onLongPressonSingleTapUp(MotionEvent e):从名子也可以看出,一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件 触发顺序: 点击一下非常快的(不滑动)Touchup: onDown-onSingleTapUp-onSingleTapConfirmed 点击一下稍微慢点的(不滑动)Touchup: onDown-onShowPress-onSingleTapUp-onSingleTapConfirmedonFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发 参数解释: e1:第1个ACTION_DOWN MotionEvent e2:最后一个ACTION_MOVE MotionEvent velocityX:X轴上的移动速度,像素/秒 velocityY:Y轴上的移动速度,像素/秒 onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法 在ACTION_MOVE动作发生时就会触发 滑屏:手指触动屏幕后,稍微滑动后立即松开 onDown-onScroll-onScroll-onScroll-onFling 拖动 onDown-onScroll-onScroll-onFiling 可见,无论是滑屏,还是拖动,影响的只是中间OnScroll触发的数量多少而已,最终都会触发onFling事件!2、实例要使用GestureDetector,有三步要走:1、创建OnGestureListener监听函数:可以使用构造实例:javaview plaincopy1. GestureDetector.OnGestureListenerlistener=newGestureDetector.OnGestureListener()2. 3. ;也可以构造类:javaview plaincopy1. privateclassgestureListenerimplementsGestureDetector.OnGestureListener2. 3. 2、创建GestureDetector实例mGestureDetector:构造函数有下面三个,根据需要选择:javaview plaincopy1. GestureDetectorgestureDetector=newGestureDetector(GestureDetector.OnGestureListenerlistener);2. GestureDetectorgestureDetector=newGestureDetector(Contextcontext,GestureDetector.OnGestureListenerlistener);3. GestureDetectorgestureDetector=newGestureDetector(Contextcontext,GestureDetector.SimpleOnGestureListenerlistener);3、onTouch(View v, MotionEvent event)中拦截:javaview plaincopy1. publicbooleanonTouch(Viewv,MotionEventevent)2. returnmGestureDetector.onTouchEvent(event);3. 4、控件绑定javaview plaincopy1. TextViewtv=(TextView)findViewById(R.id.tv);2. tv.setOnTouchListener(this);现在进入实例阶段:首先,在主布局页面添加一个textView,并将其放大到整屏,方便在其上的手势识别,代码为:javaview plaincopy1. 6. 7. 14. 15. 然后在JAVA代码中,依据上面的三步走原则,写出代码,并在所有的手势下添加上Toast提示并写上Logjavaview plaincopy1. publicclassMainActivityextendsActivityimplementsOnTouchListener2. 3. privateGestureDetectormGestureDetector;4. 5. 6. Override7. protectedvoidonCreate(BundlesavedInstanceState)8. super.onCreate(savedInstanceState);9. setContentView(R.layout.activity_main);10. 11. mGestureDetector=newGestureDetector(newgestureListener();/使用派生自OnGestureListener12. 13. TextViewtv=(TextView)findViewById(R.id.tv);14. tv.setOnTouchListener(this);15. tv.setFocusable(true);16. tv.setClickable(true);17. tv.setLongClickable(true);18. 19. 20. 21. /*22. *在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector23. *来分析是否有合适的callback函数来处理用户的手势24. */25. publicbooleanonTouch(Viewv,MotionEventevent)26. returnmGestureDetector.onTouchEvent(event);27. 28. 29. privateclassgestureListenerimplementsGestureDetector.OnGestureListener30. 31. /用户轻触触摸屏,由1个MotionEventACTION_DOWN触发32. publicbooleanonDown(MotionEvente)33. Log.i(MyGesture,onDown);34. Toast.makeText(MainActivity.this,onDown,Toast.LENGTH_SHORT).show();35. returnfalse;36. 37. 38. /*39. *用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEventACTION_DOWN触发40. *注意和onDown()的区别,强调的是没有松开或者拖动的状态41. *42. *而onDown也是由一个MotionEventACTION_DOWN触发的,但是他没有任何限制,43. *也就是说当用户点击的时候,首先MotionEventACTION_DOWN,onDown就会执行,44. *如果在按下的瞬间没有松开或者是拖动的时候onShowPress就会执行,如果是按下的时间超过瞬间45. *(这块我也不太清楚瞬间的时间差是多少,一般情况下都会执行onShowPress),拖动了,就不执行onShowPress。46. */47. publicvoidonShowPress(MotionEvente)48. Log.i(MyGesture,onShowPress);49. Toast.makeText(MainActivity.this,onShowPress,Toast.LENGTH_SHORT).show();50. 51. 52. /用户(轻触触摸屏后)松开,由一个1个MotionEventACTION_UP触发53. /轻击一下屏幕,立刻抬起来,才会有这个触发54. /从名子也可以看出,一次单独的轻击抬起操作,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以这个事件就不再响应55. publicbooleanonSingleTapUp(MotionEvente)56. Log.i(MyGesture,onSingleTapUp);57. Toast.makeText(MainActivity.this,onSingleTapUp,Toast.LENGTH_SHORT).show();58. returntrue;59. 60. 61. /用户按下触摸屏,并拖动,由1个MotionEventACTION_DOWN,多个ACTION_MOVE触发62. publicbooleanonScroll(MotionEvente1,MotionEvente2,63. floatdistanceX,floatdistanceY)64. Log.i(MyGesture22,onScroll:+(e2.getX()-e1.getX()+distanceX);65. Toast.makeText(MainActivity.this,onScroll,Toast.LENGTH_LONG).show();66. 67. returntrue;68. 69. 70. /用户长按触摸屏,由多个MotionEventACTION_DOWN触发71. publicvoidonLongPress(MotionEvente)72. Log.i(MyGesture,onLongPress);73. Toast.makeText(MainActivity.this,onLongPress,Toast.LENGTH_LONG).show();74. 75. 76. /用户按下触摸屏、快速移动后松开,由1个MotionEventACTION_DOWN,多个ACTION_MOVE,1个ACTION_UP触发77. publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,78. floatvelocityY)79. Log.i(MyGesture,onFling);80. Toast.makeText(MainActivity.this,onFling,Toast.LENGTH_LONG).show();81. returntrue;82. 83. ;84. 85. 86. 源码在博客底部给出。三、GestureDetector.OnDoubleTapListener-接口1、构建有两种方式设置双击监听:方法一:新建一个类同时派生自OnGestureListener和OnDoubleTapListener:javaview plaincopy1. privateclassgestureListenerimplementsGestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener2. 方法二:使用GestureDetector:setOnDoubleTapListener();函数设置监听:javaview plaincopy1. /构建GestureDetector实例2. mGestureDetector=newGestureDetector(newgestureListener();/使用派生自OnGestureListener3. privateclassgestureListenerimplementsGestureDetector.OnGestureListener4. 5. 6. 7. /设置双击监听器8. mGestureDetector.setOnDoubleTapListener(newdoubleTapListener();9. privateclassdoubleTapListenerimplementsGestureDetector.OnDoubleTapListener10. 11. 注意:大家可以看到无论在方法一还是在方法二中,都需要派生自GestureDetector.OnGestureListener,前面我们说过GestureDetector 的构造函数,如下:javaview plaincopy1. GestureDetectorgestureDetector=newGestureDetector(GestureDetector.OnGestureListenerlistener);2. GestureDetectorgestureDetector=newGestureDetector(Contextcontext,GestureDetector.OnGestureListenerlistener);3. GestureDetectorgestureDetector=newGestureDetector(Contextcontext,GestureDetector.SimpleOnGestureListenerlistener);可以看到,在构造函数中,除了后面要讲的SimpleOnGestureListener 以外的其它两个构造函数都必须是OnGestureListener的实例。所以要想使用OnDoubleTapListener的几个函数,就必须先实现OnGestureListener。2、函数讲解:首先看一下OnDoubleTapListener接口必须重写的三个函数:javaview plaincopy1. privateclassdoubleTapListenerimplementsGestureDetector.OnDoubleTapListener2. 3. publicbooleanonSingleTapConfirmed(MotionEvente)4. /TODOAuto-generatedmethodstub5. returnfalse;6. 7. 8. publicbooleanonDoubleTap(MotionEvente)9. /TODOAuto-generatedmethodstub10. returnfalse;11. 12. 13. publicbooleanonDoubleTapEvent(MotionEvente)14. /TODOAuto-generatedmethodstub15. returnfalse;16. 17. onSingleTapConfirmed(MotionEvent e):单击事件。用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。触发顺序是:OnDown-OnsingleTapUp-OnsingleTapConfirmed关于onSingleTapConfirmed和onSingleTapUp的一点区别: OnGestureListener有这样的一个方法onSingleTapUp,和onSingleTapConfirmed容易混淆。二者的区别是:onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行。onDoubleTap(MotionEvent e):双击事件onDoubleTapEvent(MotionEvent e):双击间隔中发生的动作。指触发onDoubleTap以后,在双击之间发生的其它动作,包含down、up和move事件;下图是双击一下的Log输出:两点总结:1、从上图可以看出,在第二下点击时,先触发OnDoubleTap,然后再触发OnDown(第二次点击)2、其次在触发OnDoubleTap以后,就开始触发onDoubleTapEvent了,onDoubleTapEvent后面的数字代表了当前的事件,0指ACTION_DOWN,1指ACTION_UP,2 指ACTION_MOVE在上一个例子的基础上,我们再添加一个双击监听类,实现如下:javaview plaincopy1. publicclassMainActivityextendsActivityimplementsOnTouchListener2. 3. privateGestureDetectormGestureDetector;4. 5. 6. Override7. protectedvoidonCreate(BundlesavedInstanceState)8. super.onCreate(savedInstanceState);9. setContentView(R.layout.activity_main);10. 11. 12. mGestureDetector=newGestureDetector(newgestureListener();/使用派生自OnGestureListener13. mGestureDetector.setOnDoubleTapListener(newdoubleTapListener();14. 15. TextViewtv=(TextView)findViewById(R.id.tv);16. tv.setOnTouchListener(this);17. tv.setFocusable(true);18. tv.setClickable(true);19. tv.setLongClickable(true);20. 21. 22. 23. /*24. *在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector25. *来分析是否有合适的callback函数来处理用户的手势26. */27. publicbooleanonTouch(Viewv,MotionEventevent)28. returnmGestureDetector.onTouchEvent(event);29. 30. 31. /OnGestureListener监听32. privat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辅警礼仪的意义
- 农业银行2025常州市小语种岗笔试题及答案
- 邮储银行2025辽源市笔试行测高频题及答案
- 工商银行2025无锡市秋招笔试创新题型专练及答案
- 建设银行2025镇江市结构化面试15问及话术
- 2025年3D打印的医疗器械开发
- 2025年3D打印的3D打印材料技术
- 辅导员任职知识培训课件
- 中国银行2025秋招笔试专业知识题专练及答案辽宁地区
- 邮储银行2025平顶山市数据分析师笔试题及答案
- 做最勇敢的自己
- 《诚信是金》班会课件
- 药房用药小知识培训课件
- 乳腺癌图文课件版
- 《支气管动脉栓塞术》课件
- 子宫肌瘤-妇产科课件
- 2024-2025年江苏专转本英语历年真题(含答案)
- GB/T 44808.1-2024人类工效学无障碍设计第1部分:消费品中的语音提示
- 《机器人驱动与运动控制》全套教学课件
- 包装箱制作合作协议书范文模板
- 电商平台知识产权保护与维权服务合同
评论
0/150
提交评论