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
。在您的 TouchListener
的 onTouchEvent
方法中,将每个事件传递给您的 GestureDetector
和 return false
。 In GestureDetector
return true
in onDown
只保留 onSingleTapUp
原样。
您的问题是您通过 returning true
消耗了 onTouchEvent
方法中的每个触摸事件,因此事件不会到达您的 ViewPager
使其不可滚动。
编辑: 如果您想在不使用 GestureDetector
的情况下自己识别单击,那么只需将 OnTouchListener
附加到您的 ViewPager
做了但不要忘记 return false
在 onTouchEvent
方法中。
我想在用户单击屏幕时禁用显示的按钮。我目前在我的 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
。在您的 TouchListener
的 onTouchEvent
方法中,将每个事件传递给您的 GestureDetector
和 return false
。 In GestureDetector
return true
in onDown
只保留 onSingleTapUp
原样。
您的问题是您通过 returning true
消耗了 onTouchEvent
方法中的每个触摸事件,因此事件不会到达您的 ViewPager
使其不可滚动。
编辑: 如果您想在不使用 GestureDetector
的情况下自己识别单击,那么只需将 OnTouchListener
附加到您的 ViewPager
做了但不要忘记 return false
在 onTouchEvent
方法中。