Android:禁用屏幕点击按钮

Android: Disable Buttons on Screen-Tap

我想在用户单击屏幕时禁用显示的按钮。我目前在我的 MainActivity 和提到的按钮上有一个 ViewPager。

我必须使用哪个侦听器才能获取单击事件以及我必须在哪里 "put" 打开它,这样它就不会覆盖我在 viewPager 中的滑动手势? (我试图在我的 viewPager 上放置一个 onTouchListener,它确实有效,但显然我不能再滑动了)

我的插图代码(请轻点,我是 Android 的新手 :)):

public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener{ 
(some Code, onCreate etc...)
@Override
public boolean onTouchEvent(MotionEvent event) {
        int action = MotionEventCompat.getActionMasked(event);

        switch(action) {
            case (MotionEvent.ACTION_DOWN) :
                Log.d(DEBUG_TAG, "Action was DOWN");
                return true;
            case (MotionEvent.ACTION_MOVE) :
                Log.d(DEBUG_TAG,"Action was MOVE");
                return true;
            case (MotionEvent.ACTION_UP) :
                triggerButtons();
                Log.d(DEBUG_TAG,"Action was UP");
                return true;
            case (MotionEvent.ACTION_CANCEL) :
                Log.d(DEBUG_TAG,"Action was CANCEL");
                return true;
            case (MotionEvent.ACTION_OUTSIDE) :
                Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
                        "of current screen element");
                return true;
            default :
                return super.onTouchEvent(event);
        }
}

@Override
public boolean onDown(MotionEvent e) {
    return false;
}

@Override
public void onShowPress(MotionEvent e) {

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    triggerButtons();
    return true;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    return false;
}

@Override
public void onLongPress(MotionEvent e) {

}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    return false;
}

如您所见,我希望在 touch/tap 发生后用户抬起手指时触发我的 "triggerButtons"。我需要在我的 onCreate 中分配什么侦听器才能完成这项工作?

(如果你也知道我怎么听doubleTap就太好了!)

编辑:

我已经添加了

View.OnTouchListener mOnTouchListener; 
GestureDetector mGestureDetector; 

这是我在 MainActivity 的 onCreate 中添加的:

mOnTouchListener = new View.OnTouchListener() { 
    @Override public boolean onTouch(View v, MotionEvent event) {  
    mGestureDetector.onTouchEvent(event); 
    return false; 
   } 
}; 

mViewPager.setOnTouchListener(mOnTouchListener); 

解决方案:

在创建中:

mOnTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            touchEventDecider(event);
            return false;
        }
    };

方法 touchEventDecider:

private boolean touchEventDecider(MotionEvent event) {
    int action = MotionEventCompat.getActionMasked(event);

    switch(action) {
        case (MotionEvent.ACTION_DOWN) :
            Log.d(DEBUG_TAG, "Action was DOWN");
            return true;
        case (MotionEvent.ACTION_MOVE) :
            Log.d(DEBUG_TAG,"Action was MOVE");
            return true;
        case (MotionEvent.ACTION_UP) :
            triggerButtons();
            Log.d(DEBUG_TAG,"Action was UP");
            return true;
        case (MotionEvent.ACTION_CANCEL) :
            Log.d(DEBUG_TAG,"Action was CANCEL");
            return true;
        case (MotionEvent.ACTION_OUTSIDE) :
            Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
                    "of current screen element");
            return true;
        default :
            return super.onTouchEvent(event);
    }
}

OnTouchListener 添加到您的 ViewPager。在您的 TouchListeneronTouchEvent 方法中,将每个事件传递给您的 GestureDetector 和 return false。 In GestureDetector return true in onDown 只保留 onSingleTapUp 原样。

您的问题是您通过 returning true 消耗了 onTouchEvent 方法中的每个触摸事件,因此事件不会到达您的 ViewPager 使其不可滚动。

编辑: 如果您想在不使用 GestureDetector 的情况下自己识别单击,那么只需将 OnTouchListener 附加到您的 ViewPager做了但不要忘记 return falseonTouchEvent 方法中。