onLongPress", Toast.LENGTH_SHORT).show(); } @Override public boolean onFling velocityX, float velocityY) { Toast.makeText(MainActivity.this, "onFling onFling 滑动相应. 就是快速划一下, 它就会触发. ---- 小栗子体验一下 也说了一些, 我们来体验下. 我们拎着按钮绕了一圈, 我们看下后台的打印. ? 点击时候发生了: onDown onShowPress onSingleTapUp 绕圈时候是: onDown onShowPress onScroll onScroll onScroll onFling 那么再看第二次, 多了一个onFling, 而且是在最后, 就是说, 我们的拖动操作, 最后抬手的时候会触发onFling, 但是不是100%.
这些事件有: onDown,onFling,onLongPress,onScroll,onShowPress,onSingleTapUp。 本文我们只用到onFling手势 处理onFling手势的操作。 onFling事件触发时,由操作系统传入的参数有MotionEvent e1, MotionEvent e2, float velocityX, float velocityY。
效果图如下: 1、基本原理 在 Activity 中实现 OnGestureListener 的接口 onFling() 手势事件,通过自定义的 View 绘制draw() 图片 2、Activity onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: flingView.onFling ()方法,给继承自View的 FlingView 的onFling()成员方法传递滑动参数,获取手势的速度 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { flingView.onFling((int) - velocityX); return true; } 3、FlingView FlingView中,获取来自Activity中的手势速度 public void onFling(int paramFloat1) { if (offsetX
以下是 GestureDetector 的配置: @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.d(TAG, "onFling:"); try { float diffX exception.printStackTrace(); } return false; } Kotlin版本 override fun onFling (e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { Log.d(TAG, "onFling (MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.d(TAG, "onFling:");
MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 public boolean onFling float velocityX, float velocityY) { Log.i("MyGesture", "onFling velocityX, float velocityY) { Log.i("MyGesture", "onFling velocityX, float velocityY) { Log.i("MyGesture", "onFling float velocityX, float velocityY) { Log.i("MyGesture", "onFling
GestureDetector对象,通过new GestureDetector(context,listener),参数:上下文,监听器 匿名内部类实现简单手势监听器SimpleOnGestureListener接口,重写onFling GestureDetector.SimpleOnGestureListener() { @Override public boolean onFling return true; } return super.onFling
onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } // OnGestureListener中的onFling 方法就是滑动事件的回调函数 @Override public boolean onFling(MotionEvent arg0, MotionEvent arg1, float velocityX, onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } 其中只有public boolean onFling MotionEvent arg0, MotionEvent arg1, float velocityX,float velocityY) 是我们需要的,它就是 OnGestureListener中的onFling 方法就是滑动事件的回调函数 我们只需要去重载它就可以了 仔细看下我们是怎么重载这个函数的: @Override public boolean onFling(MotionEvent arg0,
Log.e("onScroll", "onScroll"); return false; } @Override public boolean onFling (MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.e("onFling ", "onFling"); return false; } } 长按 ?
* @param e1 第一个按下的动作事件 * @param e2 触发当前这个方法的“猛扔”动作的事件 * @param velocityX 触发onFling 方法期间X轴上的移动速度 * @param velocityY 触发onFling方法期间Y轴上的移动速度 * @return */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false 方法期间X轴上的移动速度 * @param velocityY 触发onFling方法期间Y轴上的移动速度 * @return */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { result +
MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 public boolean onFling float velocityX, float velocityY) { Log.i("MyGesture", "onFling velocityX, float velocityY) { Log.i("MyGesture", "onFling velocityX, float velocityY) { Log.i("MyGesture", "onFling float velocityX, float velocityY) { Log.i("MyGesture", "onFling
状态时的高亮显示 onSingleTapUp : 在用户轻点一下再弹起时调用,通常用于点击事件 onScroll : 在用户滑动过程中调用 onLongPress : 在用户长按时调用,通常用于长按事件 onFling 手势监听器OnGestureListener需要重写的方法中,onDown、onScroll、onSingleTapUp、onFling这四个方法得返回布尔值,返回true表示其他事件仍需响应,返回false 一般情况下,onDown和onScroll要返回true,因为这两个方法尚无法构成具体的事件意图;而onSingleTapUp和onFling要返回false,因为onSingleTapUp表明了此次是点击事件 ,onFling表明了此次是翻页事件。 return true; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling
// 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发 public boolean onFling (MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i("MyGesture", "onFling "); Toast.makeText(this, "onFling", Toast.LENGTH_LONG).show(); return true; public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // "); return super.onFling(e1, e2, velocityX, velocityY); }
viewFlipper.setAutoStart(false); return gestureDetector.onTouchEvent(event); // 注册手势事件 } @Override public boolean onFling 此事件一般用于通知用户press按击事件已发生 4、onLongPress(MotionEvent e):长按事件,down事件后up事件前的一段时间间隔后(由系统分配,也可自定义),如果仍然按住屏幕则视为长按事件 5、onFling distanceY):在屏幕上拖动事件,即down按下点——scroll拖动——up抬起点的move移动事件 本示例的滑动屏幕动画,仅用到了上面的GestureDetector.OnGestureListener及其onFling GestureDetector.OnGestureListener手势监听的gestureDetector.onTouchEvent(event);事件接口 3、在GestureDetector.OnGestureListener回调函数onFling
对于 onFling 我个人感觉这是个最常用的方法,就像它的名字,翻译过来是拖、拽、扔的意思。 举个例子 RecyclerView 或者 ListView 我们都有用过,当我们快速上拉后会滚动一定距离停止,我们可爱的 onFling 就是用于检测这种手势的。 listener = new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onFling "); // 后续工作 super.onLongPress(e); } }; onScroll onScroll 方法和 onFling 很像,唯一的区别在于,onFling 的参数是滑动的速度,而 onScroll 的后两个参数则是滑动的距离: 参数 意义 e1 手指按下时的 MotionEvent e2 手指抬起时的 MotionEvent
super.dispatchTouchEvent(ev); handled |= mGesture.onTouchEvent(ev); return handled; } protected boolean onFling onDown(MotionEvent e) { return HorizontalListView.this.onDown(e); } @Override public boolean onFling MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return HorizontalListView.this.onFling
handled |= mGesture.onTouchEvent(ev); return handled; } protected boolean onFling { return HorizontalListView.this.onDown(e); } @Override public boolean onFling velocityX, float velocityY) { return HorizontalListView.this .onFling
Demo示例代码 学完了理论知识,就看一下代码了,布局很简单,就一个ImageView,将touch事件交给了GestureDetector,然后在onFling()方法中实现FlingAnimation : Boolean { return true } override fun onFling(e1: MotionEvent?
更具体一些,在构造GestureDetector时候需要传进来一个SimpleOnGestureListener,其实就是重载SimpleOnGestureListener的onFling,在onFling GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onFling totalItemCount) { mOnPullToRefreshListener.onBottom(); } } return super.onFling
onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)(手指在触摸屏上滑动)和public boolean onFling distanceX,isScrollingState); return true; } @Override public boolean onFling currentValue=(int)(minUnitValue*itemNum); }else if(action==fastScrollState){ //快速一滑(onFling 2.当我们快速一划时,就会回调GestureDetector里的onFling()方法,在方法里用scroller.fling(rollingWidth,0,(int)(-velocityX/1.5),
onSingleTapConfirmed 点击一下稍微慢点的(不滑动)Touchup: onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed onFling ACTION_MOVE动作发生时就会触发 滑屏:手指触动屏幕后,稍微滑动后立即松开 onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling MotionEvent e) { // TODO Auto-generated method stub } public boolean onFling