Android Webview的快速返回(滚动时自动隐藏操作栏)

Android Webview的快速返回(滚动时自动隐藏操作栏),android,scroll,android-webview,hide,Android,Scroll,Android Webview,Hide,我将一个ScrollListener添加到ObservableWebView中。我想实现与Chrome或Firefox相同的效果,在Chrome或Firefox中,当用户向下滚动时,actionbar被隐藏,当用户向上滚动时,actionbar被显示。我几乎成功了。我在webView上有一个marginTop(查看访问的网页顶部),当用户滚动超过工具栏高度时,我会将其删除 问题是当更改边距时,webView会闪烁,因为滚动条正在更改,我不知道如何解决这个问题。我看到有人在用计时器,但不确定 到目

我将一个
ScrollListener
添加到
ObservableWebView
中。我想实现与Chrome或Firefox相同的效果,在Chrome或Firefox中,当用户向下滚动时,actionbar被隐藏,当用户向上滚动时,actionbar被显示。我几乎成功了。我在
webView
上有一个
marginTop
(查看访问的网页顶部),当用户滚动超过工具栏高度时,我会将其删除

问题是当更改边距时,
webView
会闪烁,因为滚动条正在更改,我不知道如何解决这个问题。我看到有人在用计时器,但不确定

到目前为止,我得到的是:

webView.setOnScrollChangedCallback((currentX, currentY) -> {

    int sensitivity = (int) dp48;
    int deltaY = prevScroll - currentY;
    prevScroll = currentY;

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
        FrameLayout.LayoutParams.MATCH_PARENT,
        FrameLayout.LayoutParams.MATCH_PARENT
    );

    if (currentY > dp48 && atTop) {
        atTop = false;
        params.topMargin = 0;
        webView.setLayoutParams(params);
    } else if (currentY < dp48 && !atTop) {
        atTop = true;
        params.topMargin = (int) dp48;
        webView.setLayoutParams(params);
    } else {
        if (deltaY > sensitivity) {
            deltaY = sensitivity;
        } else if (deltaY < -sensitivity) {
            deltaY = -sensitivity;
        }
        if (Math.signum(deltaY) * Math.signum(actionBarAutoHideSignal) < 0) {
            // deltaY is a motion opposite to the accumulated signal, so reset signal
            actionBarAutoHideSignal = deltaY;
        } else {
            // add to accumulated signal
            mActionBarAutoHideSignal += deltaY;
        }
        boolean shouldShow = currentY < 0 || (actionBarAutoHideSignal <= -sensitivity);
        autoShowOrHideActionBar(shouldShow);
    }
});

private void autoShowOrHideActionBar(boolean hide) {
    if (hide == toolbarShowing) {
        return;
    }

    toolbarShowing = hide;

    if (hide) {
        toolbar.animate()
                .translationY(-toolbar.getBottom())
                .alpha(0)
                .setDuration(300)
                .setInterpolator(new DecelerateInterpolator());
    } else {
        toolbar.animate()
                .translationY(0)
                .alpha(1)
                .setDuration(300)
                .setInterpolator(new DecelerateInterpolator());
    }
}
webView.setOnScrollChangedCallback((currentX,currentY)->{
int灵敏度=(int)dp48;
int deltaY=前滚动-当前;
prevScroll=当前;
RelativeLayout.LayoutParams params=新的RelativeLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_父级,
FrameLayout.LayoutParams.MATCH_父项
);
如果(当前Y>dp48&&P){
atTop=假;
params.topMargin=0;
webView.setLayoutParams(params);
}否则,如果(当前y灵敏度){
deltaY=敏感性;
}否则如果(德尔泰<-灵敏度){
deltaY=敏感性;
}
if(数学符号(deltaY)*数学符号(ActionBarautoHiddesignal)<0){
//deltaY是一个与累计信号相反的运动,因此重置信号
actionBarAutoHideSignal=deltaY;
}否则{
//累加信号
mActionBarAutoHideSignal+=三角洲;
}
布尔值shouldShow=currentY<0 | |(actionBarAutoHideSignal

我正在研究其他浏览器正在做什么,我发现了一个非常有趣的方法。以下是我发现的一些选项,可以在工具栏隐藏/显示时不让滚动条闪烁:

  • 这里有一个简短的解释Chrome(和Firefox?)正在做什么。Chrome正在改变Chrome的网络视图,它看起来相当粗糙,我甚至没有进入细节

  • OperaApus Browser和其他一些浏览器不会调整webview的大小,但会将高度设置为
    screenHeight-toolbarHeight
    ,并且在底部有一个静态工具栏,当显示顶部工具栏时,webview会隐藏在底部。webview本身会上下移动

  • 其他浏览器如CMMercury
    topMargin
    bottomMargin
    设置为与webview相等,并将它们一起设置动画。这很好,因为同时增加上下边距可以避免滚动条跳转。而且,性能也比我预期的要好

  • UC浏览器有一个按钮,单击该按钮可显示工具栏,滚动时再次隐藏

  • <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/web_view_container_rail"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone">
        <View
            android:id="@+id/left_shadow"
            android:layout_width="6dp"
            android:layout_height="match_parent"
            android:background="@drawable/dropshadow_left"/>
        <RelativeLayout
            android:id="@+id/web_view_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ffff">
            <com.onedepth.search.view.BounceProgressBar
                android:id="@+id/web_view_progress_bar"
                android:layout_width="match_parent"
                android:layout_height="2dp"
                android:elevation="8dp">
            </com.onedepth.search.view.BounceProgressBar>
            <com.onedepth.search.view.ObservableWebView
                android:id="@+id/webview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fadeScrollbars="true"
                android:layout_alignParentBottom="true"
                android:layout_marginTop="48dp"/>
            <!--<include layout="@layout/toolbar_dropshadow"/>!-->
            <RelativeLayout
                android:id="@+id/webview_toolbar"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:background="@color/white"
                android:elevation="8dp"
                android:layout_marginTop="0dp"
                >
                <ImageView
                    android:id="@+id/web_view_close"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_gravity="center"
                    android:layout_alignParentLeft="true"
                    android:src="@drawable/x"
                    android:scaleType="center"
                    android:clickable="true"
                    android:background="?attr/selectableItemBackground"/>
                <LinearLayout
                    android:layout_width="192dp"
                    android:layout_height="48dp"
                    android:layout_alignParentRight="true"
                    android:gravity="right"
                    android:background="?attr/selectableItemBackground">
                    <ImageView
                        android:id="@+id/web_view_reload"
                        android:layout_width="48dp"
                        android:layout_height="48dp"
                        android:src="@drawable/replay"
                        android:scaleType="center"
                        android:clickable="true"
                        android:background="?attr/selectableItemBackground"/>
                    <ImageView
                        android:id="@+id/web_view_action"
                        android:layout_width="48dp"
                        android:layout_height="48dp"
                        android:src="@drawable/stack_icon_on"
                        android:scaleType="center"
                        android:clickable="true"
                        android:background="?attr/selectableItemBackground"/>
                    <ImageView
                        android:id="@+id/web_view_screenshot"
                        android:layout_width="48dp"
                        android:layout_height="48dp"
                        android:src="@drawable/screenshot"
                        android:scaleType="center"
                        android:clickable="true"
                        android:background="?attr/selectableItemBackground"/>
                    <ImageView
                        android:id="@+id/web_view_overflow"
                        android:layout_width="36dp"
                        android:layout_height="48dp"
                        android:src="@drawable/overflow"
                        android:scaleType="center"
                        android:clickable="true"
                        android:background="?attr/selectableItemBackground"/>
                </LinearLayout>
            </RelativeLayout>
    
        </RelativeLayout>
    </FrameLayout>