簡體   English   中英

在 webview 滾動上隱藏線性布局

[英]Hide linearlayout on webview scroll

我有一個應用程序屏幕,其中有一個 web 視圖,以及屏幕底部按鈕的線性布局。 我有一個附加到 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;
                    }

                }
            });

您可以通過CustomWebView執行此操作:

自定義WebView.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. 將您的根view設為CoordinatorLayout

  2. 將您的內容包裝到NestedScrollView

  3. 將以下內容添加到您的底部View

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM