向上滑动时隐藏 ActionBar,向下滑动时显示
Hide the ActionBar when swiping up and show when swiping down
我似乎对隐藏和显示 ActionBar 有疑问。
我的应用程序一开始是隐藏的,我希望它在用户向下滑动屏幕的任何部分并隐藏它然后用户向上滑动时重新出现。
我尝试通过以下方式实现:
方法一:在onCreate
View mView = getWindow().getDecorView();
//mView.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE;
mView.setSystemUiVisibility(uiOptions);
mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(context, "Swiped down", Toast.LENGTH_SHORT).show();
//getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().show();
return true;
case MotionEvent.ACTION_UP:
Toast.makeText(context, "Swiped up", Toast.LENGTH_SHORT).show();
//getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
return true;
default: return false;
}
//return false;
}
});
方法二:
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case (MotionEvent.ACTION_DOWN):
Toast.makeText(context, "Swiped down", Toast.LENGTH_SHORT).show();
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().show();
return true;
case (MotionEvent.ACTION_UP):
Toast.makeText(context, "Swiped up", Toast.LENGTH_SHORT).show();
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
return true;
default:
return super.onTouchEvent(event);
}
}
下面是问题:
- 该功能仅适用于我没有按钮或其他可点击元素的屏幕部分;
- 在适用的地方,它与滑动无关。只要我将手指按住视图中不可点击的字段,它就会显示栏。
编辑:
根据评论的回复,我设法使操作栏基于滚动显示和隐藏,但我仍然遇到#1 的问题,我无法在屏幕的任何部分执行操作。
只对onClickListener
未评估的部分有效
经过几天的调查,我已经设法解决了这个问题。似乎最好的选择是像这样实施 GestureDetector
public class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
private MainGame mainGame;
MyGestureDetector(MainGame mainGame) {
this.mainGame = mainGame;
}
@Override
public boolean onDown(MotionEvent e) {
Log.d("Gesture", "onDown");
return super.onDown(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.d("Gesture", "onSingleTapConfirmed");
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.d("Gesture", "onSingleTapUp");
return true;
}
@Override
public void onShowPress(MotionEvent e) {
Log.d("Gesture", "onShowPress");
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("Gesture", "onDoubleTap");
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.d("Gesture", "onDoubleTapEvent");
return true;
}
@Override
public void onLongPress(MotionEvent e) {
Log.d("Gesture", "onLongPress");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.d("Gesture", "onScroll");
if (e1.getY() < e2.getY()) {
Log.d("Gesture", "Scroll Down");
}
if (e1.getY() > e1.getY()) {
Log.d("Gesture", "Scroll Up");
}
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getY() < e2.getY()) {
Log.d("Gesture", "Swipe Down " + e1.getY() + " - " + e2.getY());
mainGame.getSupportActionBar().hide();
}
if (e1.getY() > e2.getY()) {
Log.d("Gesture", "Swipe Up" + e1.getY() + " - " + e2.getY());
mainGame.getSupportActionBar().hide();
}
return true;
}
}
并在我的主 activity 中将其实现为 onTouch
,并在我的主 activity 中为每个布局部分设置监听器。
在 onCreate
中:
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mViewSelected = v;
mGestureDetector.onTouchEvent(event);
return false;
}
});
gameScoreP1.setOnTouchListener(this);
gameScoreP2.setOnTouchListener(this);
fullNameP1.setOnTouchListener(this);
fullNameP2.setOnTouchListener(this);
以及覆盖手势的方法:
@Override
public boolean onTouch(View v, MotionEvent event) {
if (myGestureDetector.onSingleTapConfirmed(event)) {
switch (v.getId()) {
case R.id.fullNameP1:
diagUtils.changePlayerNameDialog(1, this);
return false;
case R.id.fullNameP2:
diagUtils.changePlayerNameDialog(2, this);
return false;
case R.id.gameScoreP1:
scoreSetter.manageGameSetPoints(1);
return false;
case R.id.gameScoreP2:
scoreSetter.manageGameSetPoints(2);
return false;
default:
return false;
}
} else return true;
}
现在的问题是,当我在像 gameScoreP1 这样的视图上执行快速移动时,它也会检测到点击。有什么办法让这些独占吗?
编辑
通过将视图设置为可点击,也设法解决了第二个问题:fullNameP1.setClickable(true)
我似乎对隐藏和显示 ActionBar 有疑问。 我的应用程序一开始是隐藏的,我希望它在用户向下滑动屏幕的任何部分并隐藏它然后用户向上滑动时重新出现。
我尝试通过以下方式实现:
方法一:在onCreate
View mView = getWindow().getDecorView();
//mView.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE;
mView.setSystemUiVisibility(uiOptions);
mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(context, "Swiped down", Toast.LENGTH_SHORT).show();
//getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().show();
return true;
case MotionEvent.ACTION_UP:
Toast.makeText(context, "Swiped up", Toast.LENGTH_SHORT).show();
//getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
return true;
default: return false;
}
//return false;
}
});
方法二:
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case (MotionEvent.ACTION_DOWN):
Toast.makeText(context, "Swiped down", Toast.LENGTH_SHORT).show();
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().show();
return true;
case (MotionEvent.ACTION_UP):
Toast.makeText(context, "Swiped up", Toast.LENGTH_SHORT).show();
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
return true;
default:
return super.onTouchEvent(event);
}
}
下面是问题:
- 该功能仅适用于我没有按钮或其他可点击元素的屏幕部分;
- 在适用的地方,它与滑动无关。只要我将手指按住视图中不可点击的字段,它就会显示栏。
编辑:
根据评论的回复,我设法使操作栏基于滚动显示和隐藏,但我仍然遇到#1 的问题,我无法在屏幕的任何部分执行操作。
只对onClickListener
未评估的部分有效
经过几天的调查,我已经设法解决了这个问题。似乎最好的选择是像这样实施 GestureDetector
public class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
private MainGame mainGame;
MyGestureDetector(MainGame mainGame) {
this.mainGame = mainGame;
}
@Override
public boolean onDown(MotionEvent e) {
Log.d("Gesture", "onDown");
return super.onDown(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.d("Gesture", "onSingleTapConfirmed");
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.d("Gesture", "onSingleTapUp");
return true;
}
@Override
public void onShowPress(MotionEvent e) {
Log.d("Gesture", "onShowPress");
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("Gesture", "onDoubleTap");
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.d("Gesture", "onDoubleTapEvent");
return true;
}
@Override
public void onLongPress(MotionEvent e) {
Log.d("Gesture", "onLongPress");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.d("Gesture", "onScroll");
if (e1.getY() < e2.getY()) {
Log.d("Gesture", "Scroll Down");
}
if (e1.getY() > e1.getY()) {
Log.d("Gesture", "Scroll Up");
}
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getY() < e2.getY()) {
Log.d("Gesture", "Swipe Down " + e1.getY() + " - " + e2.getY());
mainGame.getSupportActionBar().hide();
}
if (e1.getY() > e2.getY()) {
Log.d("Gesture", "Swipe Up" + e1.getY() + " - " + e2.getY());
mainGame.getSupportActionBar().hide();
}
return true;
}
}
并在我的主 activity 中将其实现为 onTouch
,并在我的主 activity 中为每个布局部分设置监听器。
在 onCreate
中:
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mViewSelected = v;
mGestureDetector.onTouchEvent(event);
return false;
}
});
gameScoreP1.setOnTouchListener(this);
gameScoreP2.setOnTouchListener(this);
fullNameP1.setOnTouchListener(this);
fullNameP2.setOnTouchListener(this);
以及覆盖手势的方法:
@Override
public boolean onTouch(View v, MotionEvent event) {
if (myGestureDetector.onSingleTapConfirmed(event)) {
switch (v.getId()) {
case R.id.fullNameP1:
diagUtils.changePlayerNameDialog(1, this);
return false;
case R.id.fullNameP2:
diagUtils.changePlayerNameDialog(2, this);
return false;
case R.id.gameScoreP1:
scoreSetter.manageGameSetPoints(1);
return false;
case R.id.gameScoreP2:
scoreSetter.manageGameSetPoints(2);
return false;
default:
return false;
}
} else return true;
}
现在的问题是,当我在像 gameScoreP1 这样的视图上执行快速移动时,它也会检测到点击。有什么办法让这些独占吗?
编辑
通过将视图设置为可点击,也设法解决了第二个问题:fullNameP1.setClickable(true)