import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
public class MyGestureListener implements GestureDetector.OnGestureListener{
private static final long VELOCITY_THRESHOLD = 3000;
@Override
public boolean onDown(final MotionEvent e){ return false; }
@Override
public void onShowPress(final MotionEvent e){ }
@Override
public boolean onSingleTapUp(final MotionEvent e){ return false; }
@Override
public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX,
final float distanceY){ return false; }
@Override
public void onLongPress(final MotionEvent e){ }
@Override
public boolean onFling(final MotionEvent e1, final MotionEvent e2,
final float velocityX,
final float velocityY){
if(Math.abs(velocityX) < VELOCITY_THRESHOLD
&& Math.abs(velocityY) < VELOCITY_THRESHOLD){
return false;//if the fling is not fast enough then it's just like drag
}
//if velocity in X direction is higher than velocity in Y direction,
//then the fling is horizontal, else->vertical
if(Math.abs(velocityX) > Math.abs(velocityY)){
if(velocityX >= 0){
Log.i("TAG", "swipe right");
}else{//if velocityX is negative, then it's towards left
Log.i("TAG", "swipe left");
}
}else{
if(velocityY >= 0){
Log.i("TAG", "swipe down");
}else{
Log.i("TAG", "swipe up");
}
}
return true;
}
}
用法:
GestureDetector mDetector = new GestureDetector(MainActivity.this, new MyGestureListener());
view.setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(final View v, final MotionEvent event){
return mDetector.onTouchEvent(event);
}
});
public GestureDetector getGestureDetector(){
return gestureDetector;
}
将Activity中的 OnSwipeTouchListener 声明为类范围字段 .
OnSwipeTouchListener onSwipeTouchListener;
相应地修改使用代码:
onSwipeTouchListener = new OnSwipeTouchListener(MyActivity.this) {
public void onSwipeTop() {
Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
}
public void onSwipeRight() {
Toast.makeText(MyActivity.this, "right", Toast.LENGTH_SHORT).show();
}
public void onSwipeLeft() {
Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show();
}
public void onSwipeBottom() {
Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show();
}
});
imageView.setOnTouchListener(onSwipeTouchListener);
并覆盖 Activity 中的 dispatchTouchEvent 方法:
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
swipeListener.getGestureDetector().onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
现在滚动和滑动操作都应该有效 .
8
要在单 View 上有 Click Listener , DoubleClick Listener , OnLongPress Listener , Swipe Left , Swipe Right , Swipe Up , Swipe Down ,您需要 setOnTouchListener . 即,
view.setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) {
@Override
public void onClick() {
super.onClick();
// your on click here
}
@Override
public void onDoubleClick() {
super.onDoubleClick();
// your on onDoubleClick here
}
@Override
public void onLongClick() {
super.onLongClick();
// your on onLongClick here
}
@Override
public void onSwipeUp() {
super.onSwipeUp();
// your swipe up here
}
@Override
public void onSwipeDown() {
super.onSwipeDown();
// your swipe down here.
}
@Override
public void onSwipeLeft() {
super.onSwipeLeft();
// your swipe left here.
}
@Override
public void onSwipeRight() {
super.onSwipeRight();
// your swipe right here.
}
});
}
....
// in OnSwipeTouchListener class
private final class GestureListener extends SimpleOnGestureListener {
.... // normal GestureListener code
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
onClick(); // my method
return super.onSingleTapConfirmed(e);
}
} // end GestureListener class
public void onSwipeRight() {
}
public void onSwipeLeft() {
}
public void onSwipeTop() {
}
public void onSwipeBottom() {
}
public void onClick(){
}
// as normal
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
} // end OnSwipeTouchListener class
19 回答
OnSwipeTouchListener.java:
用法:
此代码检测左右滑动,避免不推荐使用的API调用,并且对早期答案进行了其他各种改进 .
像这样用它:
如果您还需要在这里处理点击事件的一些修改:
样本用法:
您不需要那些复杂的计算 . 只需在
OnGestureListener
内onFling
中使用GestureDetector
:MyGestureListener.java
:用法:
扩展Mirek的答案,适用于您想在滚动视图中使用滑动手势的情况 . 默认情况下,滚动视图的触摸侦听器被禁用,因此不会发生滚动操作 . 为了解决这个问题,您需要覆盖
Activity
的dispatchTouchEvent
方法,并在完成自己的侦听器后返回此方法的继承版本 .为了对Mirek的代码做一些修改:我在
OnSwipeTouchListener
中为gestureDetector
添加了一个getter .将Activity中的
OnSwipeTouchListener
声明为类范围字段 .相应地修改使用代码:
并覆盖
Activity
中的dispatchTouchEvent
方法:现在滚动和滑动操作都应该有效 .
要在单
View
上有Click Listener
,DoubleClick Listener
,OnLongPress Listener
,Swipe Left
,Swipe Right
,Swipe Up
,Swipe Down
,您需要setOnTouchListener
. 即,为此,您需要实现
OnTouchListener
的OnSwipeTouchListener
类 .使用SwipeListView并让它为您处理手势检测 .
要添加onClick,这就是我所做的 .
我正在使用Fragments,所以使用getActivity()作为上下文 . 这就是我实现它的方式 - 它的工作原理 .
@Edward Brey's method效果很好 . 如果有人还希望复制并粘贴
OnSwipeTouchListener
的导入,那么它们是:需要一些小的更新 . onTouch方法中的变量不匹配,并且不导入异常类 . 从onFling()返回false更有意义,而不是启动一个变量,为它赋值,不对它做任何事情,只是返回它 .
onTouch方法的某些部分不正确 . 见view/motionEvent cannot be resolved to a variable swipe
一个有用的提示可以节省我一些时间,我希望可以帮助其他人:当你使用这个方法时,你只想将“implements”标签添加到你的OnSwipeTouchListener类 . 您的活动和视图未实现它 . 他们只是利用你已经做过的课程!
1为Mirek,因为他的代码仍然给了我我需要的东西:)
对@Mirek Rusin的一点修改回答,现在您可以检测到多点触控滑动 . 这段代码在Kotlin上:
其中Gesture.SWIPE_RIGHT和其他人是我用于在我的活动中稍后检测手势类型的手势的唯一整数标识符:
所以你看到这里的手势是一个整数变量,它保存我之前传递过的值 .
@Mirek Rusin answeir非常好 . 但是,有一个小错误,需要修复 -
有什么区别?我们设置result = true,只有在我们检查了所有requrinments(SWIPE_THRESHOLD和SWIPE_VELOCITY_THRESHOLD都是Ok)时才设置 . 如果我们在没有实现某些要求的情况下放弃滑动,这很重要,我们必须在OnSwipeTouchListener的onTouchEvent方法中做smth!
Here is simple Android Code for detecting gesture direction
在
MainActivity.java
和activity_main.xml
中,编写以下代码:我的解决方案与上面的解决方案类似,但我将手势处理抽象为抽象类
OnGestureRegisterListener.java
,其中包括 swipe , click 和 long click 手势 .OnGestureRegisterListener.java
并且像这样使用它 . 请注意,您也可以轻松传入
View
参数 .最后一个impl只适用于此:
如果要在滑动列表项时显示一些带有操作的按钮,则互联网上有很多具有此行为的库 . 我实现了我在互联网上找到的图书馆,我非常满意 . 它使用起来非常简单,速度非常快 . 我改进了原始库,并为项目点击添加了一个新的点击监听器 . 此外,我添加了字体真棒库(http://fortawesome.github.io/Font-Awesome/),现在您只需添加一个新的项目 Headers ,并从字体awesome指定图标名称 .
Here是github链接
在Kotlin中使用Edward Brey's answer