Скрыть панель действий при проведении вверх и показать при движении вниз - PullRequest
0 голосов
/ 21 января 2019

Кажется, у меня проблема с скрытием и отображением панели действий. Мое приложение запускается со скрытым приложением, и я хочу, чтобы оно появилось снова, когда пользователи проведут пальцем вниз по любой части экрана, и скрыло его, а затем пользователь проведет пальцем вверх.

Я пытался реализовать это следующими способами:

Метод 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. Там, где это применимо, это не имеет никакого отношения к смахиванию. Он показывает полосу, пока я удерживаю палец на не кликабельном поле в виде.

EDIT:

С ответами на комментарий мне удалось заставить панель действий отображаться и скрываться на основе прокрутки, но у меня все еще есть проблема с # 1, из-за которой я не могу выполнить действие в любой части экрана.

Работает только на тех участках, где onClickListener не оценивается.

1 Ответ

0 голосов
/ 04 февраля 2019

Мне удалось решить проблему после нескольких дней расследования. Казалось, что лучшим выбором было реализовать 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, он также обнаруживает щелчок. Есть ли способ сделать это эксклюзивным?

EDIT

Также удалось решить вторую проблему, установив такие интерактивные представления, как: fullNameP1.setClickable(true)

...