当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

3.8 Gestures(手势)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:26:06

本节引言:周六不休息,刚剪完了个大平头回来,继续码字~好的,本节给大家带来点的是第三章的最后一节——Gestures(手势),用过魅族手机的朋友相信对手势肯定是不陌生的,在home键两侧像屏幕内滑动,可以打开后台任务列表等等~在应用中通过手势来操作会大大提升用户体验,比如Scroll手势在浏览器中个滚屏,Fling在浏览器中的换页等!当然,有利也有弊,比如不当的手势操作引起APP Carsh,经常这样可是会引起用户不满的!所以是否要为你的应用增加手势,可要考虑清楚哦!另外手势要和前面学的单指/多指触碰相区分哦!手势是:连续触碰的行为,比如左右上下滑动屏幕,又或者画一些不规则的几何图形!Android对上述两种手势行为都提供了支持:Android提供手势检测,并为手势识别提供了相应的监听器!Android运行开发者自行添加手势,并且提供了相应的API识别用户手势!如果你的手机是Android 4.x的原生Android系统的话,你可能可以在你的手机或者平板上看到谷歌提供的一个Gesture Builder的APP,该应用允许用户以类似于涂鸦的方式绘制一个手写符号,使之对应一个字符串名称!当然,没有这样的手机也没关系,我们有模拟器嘛,自己开个4.0的系统试试就知道了,另外,我们可以到\mmt\sdcard\gestures获取到保存手势的文件!好了,唠唠叨叨那么多,开始讲正题吧!对了,贴下官方API文档先:GestureDetector1.Android中手势交互的执行顺序1.手指触碰屏幕时,触发MotionEvent事件!2.该事件被OnTouchListener监听,可在它的onTouch()方法中获得该MotionEvent对象!3.通过GestureDetector转发MotionEvent对象给OnGestureListener4.我们可以通过OnGestureListener获得该对象,然后获取相关信息,以及做相关处理!我们来看下上述的三个类都是干嘛的:MotionEvent: 这个类用于封装手势、触摸笔、轨迹球等等的动作事件。其内部封装了两个重要的属性X和Y,这两个属性分别用于记录横轴和纵轴的坐标。GestureDetector: 识别各种手势。OnGestureListener: 这是一个手势交互的监听接口,其中提供了多个抽象方法,并根据GestureDetector的手势识别结果调用相对应的方法。——上述资料摘自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html2.GestureListener详解:从1中我们知道了监听手势的关键是:GestureListener他给我们提供了下述的回调方法:按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。长按(onLongPress): 手指按在持续一段时间,并且没有松开。滚动(onScroll): 手指在触摸屏上滑动。按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。抬起(onSingleTapUp):手指离开触摸屏的那一刹那。知道了GestureListener的相关方法后,实现手势检测也很简单,步骤如下:Step 1: 创建GestureDetector对象,创建时需实现GestureListener传入Step 2: 将Activity或者特定组件上的TouchEvent的事件交给GestureDetector处理即可!我们写个简单的代码来验证这个流程,即重写对应的方法:代码如下:public class MainActivity extends AppCompatActivity { private MyGestureListener mgListener; private GestureDetector mDetector; private final static String TAG = "MyGesture"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化GestureListener与GestureDetector对象 mgListener = new MyGestureListener(); mDetector = new GestureDetector(this, mgListener); } @Override public boolean onTouchEvent(MotionEvent event) { return mDetector.onTouchEvent(event); } //自定义一个GestureListener,这个是View类下的,别写错哦!!! private class MyGestureListener implements GestureDetector.OnGestureListener { @Override public boolean onDown(MotionEvent motionEvent) { Log.d(TAG, "onDown:按下"); return false; } @Override public void onShowPress(MotionEvent motionEvent) { Log.d(TAG, "onShowPress:手指按下一段时间,不过还没到长按"); } @Override public boolean onSingleTapUp(MotionEvent motionEvent) { Log.d(TAG, "onSingleTapUp:手指离开屏幕的一瞬间"); return false; } @Override public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { Log.d(TAG, "onScroll:在触摸屏上滑动"); return false; } @Override public void onLongPress(MotionEvent motionEvent) { Log.d(TAG, "onLongPress:长按并且没有松开"); } @Override public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { Log.d(TAG, "onFling:迅速滑动,并松开"); return false; } }}对应操作截图:1.按下后立即松开:2.长按后松开:3.轻轻一滑,同时松开:4.按住后不放持续做滑动操作:PS:从上述结果来看,我们发现了一个问题:我们实现OnGestureListener需要实现所有的手势,可能我针对的仅仅是滑动,但是你还是要去重载,这显得很逗逼,是吧,官方肯定会给出解决方法滴,官方另外给我们提供了一个SimpleOnGestureListener类只需把上述的OnGestureListener替换成SimpleOnGestureListener即可!3.简单的例子:下滑关闭Activity,上滑启动新的Activity这里就用上述的SimpleOnGestureListener来实现吧:运行效果图:实现代码:public class MainActivity extends AppCompatActivity { private GestureDetector mDetector; private final static int MIN_MOVE = 200; //最小距离 private MyGestureListener mgListener;

[1] [2] [3]  下一页


3.8 Gestures(手势)