Как я могу реализовать хром, как автоматическое скрытие навигации для моего приложения для Android?

В Chrome адресная строка будет скрыта/отображена, когда пользователь проводит пальцем вверх/вниз по содержимому.

Могу ли я реализовать аналогичную логику в своем приложении?

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/container"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity"
     tools:ignore="MergeRootFrame">
         <WebView
         android:id="@+id/my_webview"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
</FrameLayout>

Интересно, есть ли что-нибудь, что я могу сделать с помощью следующего кода, чтобы панель действий была скрыта/отображена, когда пользователь прокручивает вверх/вниз webView.

WebView webView = (WebView) findViewById(R.id.my_webview);
webView.setOnTouchListener(new View.OnTouchListener() {
     public boolean onTouch (View v, MotionEvent event) {
            webView.onTouchEvent(event);
     }
});

person Dragon warrior    schedule 18.12.2013    source источник


Ответы (4)


Во-первых, вам нужен макет с alignParentBottom и match_parent WebView и некоторой панелью вверху:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff" >

<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentBottom="true" />

<RelativeLayout
    android:id="@+id/actionBar"
    android:layout_width="match_parent"
    android:layout_height="50dp" >

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="TextView" />

</RelativeLayout>

</RelativeLayout>

Тогда вам нужен код:

1) Объявить и установить некоторые внутренние значения и изменить размер WebView, чтобы сделать его ниже нашей панели:

private int baseHeight;
private int webViewOnTouchHeight;
private int barHeight;
private float heightChange;
private float startEventY;

barHeight = actionBar.getMeasuredHeight();
baseHeight = getView().getMeasuredHeight();
webView.getLayoutParams().height = webView.getMeasuredHeight() - barHeight;
webView.requestLayout();
webView.setOnTouchListener(listener);

2) Создать метод изменения размера. Здесь мы проверяем новую высоту с ограничениями на верхнюю часть экрана и высоту бара.

private boolean resizeView(float delta) {
    heightChange = delta;
    int newHeight = (int)(webViewOnTouchHeight - delta);
    if (newHeight > baseHeight){ // scroll over top
        if (webView.getLayoutParams().height < baseHeight){
            webView.getLayoutParams().height = baseHeight;
            webView.requestLayout();
            return true;
        }       
    }else if (newHeight < baseHeight - barHeight){ // scroll below bar
        if (webView.getLayoutParams().height > baseHeight - barHeight){
            webView.getLayoutParams().height = baseHeight - barHeight;
            webView.requestLayout();
            return true;
        }
    } else { // scroll between top and bar
        webView.getLayoutParams().height = (int)(webViewOnTouchHeight - delta);
        webView.requestLayout();
        return true;
    }
    return false;
}

3) Создайте собственный прослушиватель onTouch, в котором мы изменим размер WebView и изменим значение Y нашей панели.

private OnTouchListener listener = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            startEventY = event.getY();
            heightChange = 0;
            webViewOnTouchHeight = webView.getLayoutParams().height;
            break;
        case MotionEvent.ACTION_MOVE:
            float delta = (event.getY()+heightChange)-startEventY;
            boolean heigthChanged = resizeView(delta);
            if (heigthChanged){
                actionBar.setTranslationY(baseHeight - webView.getLayoutParams().height - barHeight);
            }
        }
        return false;
    }
};
person Max_xt    schedule 27.06.2014
comment
Это работа для небольшого мобильного сайта, но слишком отстает на больших сайтах, я все еще работаю над лучшим решением. - person Max_xt; 21.07.2014

Этот паттерн называется «Быстрый возврат». Начните с этого сообщения в блоге.

Тем не менее, стоит прочитать это при рассмотрении возможности его использования.

person OferR    schedule 22.12.2013

Теперь есть действительно чистый способ сделать это без написания кода Java с использованием библиотеки поддержки проектирования. Смотрите ответ Дхир Пратапа ниже:

(Я бы поместил это как комментарий, но у меня недостаточно представителей.)

Как скрыть панель действий/панель инструментов при прокрутке вниз в веб-просмотре< /а>

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="fill_vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <WebView
            android:id="@+id/webview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
person Ali Hirani    schedule 03.06.2016
comment
У вас правильное чутье: комментарий был бы одним из подходящих способов указать на полезный ответ на другой вопрос. Пожалуйста, не публикуйте ссылки на повторяющиеся ответы. Вместо этого рассмотрите другие действия, которые могут помочь будущим пользователям найти нужный им ответ, как описано в связанном посте. - person Mogsdad; 03.06.2016

попробуйте следующий код, надеюсь, он сработает для вас:

    private void init(){
    WebView web = new WebView(this);
    final Context context = this;
    web.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View arg0, MotionEvent event) {
            // TODO Auto-generated method stub
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // show action bar
                ((Activity) context).getActionBar().show();
                break;

            case MotionEvent.ACTION_UP:
                // hide action bar
                ((Activity) context).getActionBar().hide();
                break;

            default:
                break;
            }
            return false;
        }
    });
}
person Guojun    schedule 18.12.2013
comment
ACTION_DOWN означает, что палец пользователя касается экрана. Таким образом, этот код будет быстро отображать, а затем скрывать панель действий при каждом касании. - person Manas Tungare; 07.01.2016