向上滑动时隐藏操作栏,向下滑动时显示

问题描述 投票:0回答:1

我似乎有隐藏和显示ActionBar的问题。我的应用程序以隐藏的方式开始,我希望它在用户向下滑动屏幕的任何部分时显示回来,然后将其隐藏,然后用户向上滑动。

我试过通过以下方式实现这个:

方法1:在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;
            }
        });

方法2:

@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. 该功能仅适用于我没有按钮或其他可点击的元素的屏幕部分;
  2. 在适用的地方,它与滑动无关。只要我将手指按在视图中不可点击的字段上,它就会显示该栏。

编辑:

通过评论的回复,我设法根据滚动设置动作栏显示和隐藏,但我仍然遇到#1的问题,我无法在屏幕的任何部分执行操作。

它仅适用于未评估onClickListener的部分。

android android-actionbar hide swipe
1个回答
0
投票

经过几天的调查,我成功解决了这个问题。似乎最好的选择是实现像这样的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;
        }
    }

并在我的主要活动中将其作为onTouch实现,并在我的主要活动中为每个布局部分提供听众。在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这样的视图上执行fling运动时,它也会检测到点击。有没有办法让这些独家?

编辑

通过将视图设置为可点击式来管理以解决第二个问题:fullNameP1.setClickable(true)

© www.soinside.com 2019 - 2024. All rights reserved.