隐藏webview滚动

时间:2016-05-23 18:31:46

标签: android webview onscrolllistener

我有一个应用程序屏幕,我有一个webview,以及屏幕底部的按钮线性布局。我有一个附加到webview的滚动监听器,它在滚动时给我值。我真正想要做的是,在向下滚动时逐渐隐藏底部线性布局,并在向上滚动时显示,如在少数应用程序中看到的那样,但我可以看到的所有示例都是屏幕顶部的工具栏。

我尝试了很多东西,我尝试了获得线性布局的高度,然后在滚动时,在y轴上移动它来隐藏和显示,这会移动按钮而不是实际的条形。

我尝试的主要功能是滚动时,降低条形高度,当它达到0时隐藏它,然后再显示它,但这是挤压按钮而不是将它们从屏幕底部滚动而不是改变他们的大小。

这是布局:

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:id="@+id/buttonBar"
    android:background="#403152"
    android:visibility="gone"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp">

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/facebookLink"
        android:src="@string/button1"

        android:layout_weight="1"
        android:onClick="openLink"
        android:background="@android:color/transparent"/>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/linkedinLink"
        android:src="@string/button2"

        android:layout_weight="1"
        android:background="?android:selectableItemBackground"
        android:onClick="openLink"/>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/twitterLink"
        android:src="@string/button3"

        android:layout_weight="1"
        android:background="?android:selectableItemBackground"
        android:onClick="openLink"/>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/instagramLink"
        android:src="@string/button4"

        android:layout_weight="1"
        android:background="?android:selectableItemBackground"
        android:onClick="openLink"/>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_overflow"

        android:layout_weight="1"
        android:layout_gravity="center"
        android:background="?android:selectableItemBackground"
        android:onClick="showPopup"
        android:id="@+id/aboutoption"/>
</LinearLayout>


<holidays.ObservableWebView
    android:id="@+id/scrollableWebview"
    android:layout_width="fill_parent"
    android:clickable="false"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true"
    android:layout_above="@id/buttonBar"
    android:visibility="gone"/>

然后这是我到目前为止尝试过的代码,其中包括更改高度等等 - 希望有人能指出我正确的方向,或者更好的方法解决这个问题。

mWebView.setOnScrollChangedCallback(new ObservableWebView.OnScrollChangedCallback(){
                public void onScroll(int l, int t){

                    int height = mWebView.getMeasuredHeight();
                    Log.d("HEIGHT", Integer.toString(height));


                    Display display = getWindowManager().getDefaultDisplay();
                    Point size = new Point();
                    display.getSize(size);
                    int screenHeight = size.y;

                    Log.d("Screen HEIGHT", Integer.toString(screenHeight));


                    LinearLayout layout = (LinearLayout)findViewById(R.id.buttonBar);
                    View contentsView = findViewById(R.id.buttonBar);

                    if(firstScroll == true){

                        mWebView.setLayoutParams(new RelativeLayout.LayoutParams(mWebView.getMeasuredWidth(), mWebView.getMeasuredHeight() + 10));

                        /*originalButtonBarHeight = findViewById(R.id.buttonBar).getHeight();
                        currentButtonBarHeight = originalButtonBarHeight;

                        contentsView.getLocationOnScreen(screenBarPosition);
                        contentsView.setY(screenBarPosition[1] + 1);

                        firstScroll = false;
                        layout.getLayoutParams().height = t + 1;
                        layout.requestLayout();

                        directionVal = t;*/
                    }
                    else if(firstScroll == false){
                        if(directionVal < t){
                            mWebView.setLayoutParams(new RelativeLayout.LayoutParams(mWebView.getMeasuredWidth(), mWebView.getMeasuredHeight() + 10));
                           /* Log.d("DOWN", Integer.toString(t));
                            if(currentButtonBarHeight <= 0){
                                //do nothing
                            }
                            else{
                                currentButtonBarHeight = currentButtonBarHeight - 5;

                                if(currentButtonBarHeight <= 0){
                                    currentButtonBarHeight = 0;
                                    layout.getLayoutParams().height = 0;
                                    layout.requestLayout();

                                    findViewById(R.id.buttonBar).setVisibility(View.GONE);
                                }
                                else{


                                    contentsView.getLocationOnScreen(screenBarPosition);
                                    contentsView.setY(screenBarPosition[1] + 1);

                                    layout.getLayoutParams().height = currentButtonBarHeight;
                                    layout.requestLayout();
                                }

                            }
                            /*if(t + 5 < originalButtonBarHeight) {

                            }*/
                        }
                        else if(directionVal > t){
                            Log.d("UP", Integer.toString(currentButtonBarHeight));


                            /*decreasedAmount = t - 5;
                            if (decreasedAmount < originalButtonBarHeight){
                                layout.getLayoutParams().height = t - 5;
                                layout.requestLayout();
                            }*/

                        }

                        directionVal = t;
                    }

                }
            });

2 个答案:

答案 0 :(得分:0)

您可以CustomWebView执行此操作:

<强> CustomWebView.java

public class CustomWebView extends WebView {
    private GestureDetector gestureDetector;
    public CustomWebView(Context context) {
        super(context);
    }
    public CustomWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public CustomWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return gestureDetector.onTouchEvent(ev) || super.onTouchEvent(ev);
    }

    public void setGestureDetector(GestureDetector gestureDetector) {
        this.gestureDetector = gestureDetector;
    }
}

<强> web_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:background="@android:color/transparent"
    android:orientation="vertical">    

   <com.customview.CustomWebView
            android:id="@+id/customWebView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:focusable="true" />

   // Your other Linear layout

</LinearLayout>
用于手势检测的

CustomeGestureDetector clss(我已在Fragment中添加):

private class CustomeGestureDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if(e1 == null || e2 == null) return false;
            if(e1.getPointerCount() > 1 || e2.getPointerCount() > 1) return false;
            else {
                try {
                    if(e1.getY() - e2.getY() > 20 ) {
                            // Show Your Linear Layout

                        customWebView.invalidate();
                       return false;
                    }
                    else if (e2.getY() - e1.getY() > 20 ) {
                            // Hide Your Linear Layout

                        customWebView.invalidate();
                       return false;
                    }

                } catch (Exception e) {
                    customWebView.invalidate();
                }
                return false;
            }


        }
    }

<强> WebFragment.java

private CustomWebView customWebView;

customWebView= (CustomWebView) view.findViewById(R.id.customWebView);

customWebView.setGestureDetector(new GestureDetector(new CustomeGestureDetector()));

希望它会对你有所帮助。

答案 1 :(得分:0)

  1. 将您的view根设为CoordinatorLayout

  2. 将您的内容包装到NestedScrollView中。

  3. 在您的底部View中添加以下内容:

    app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior">