【问题标题】:Hide linearlayout on webview scroll在 webview 滚动上隐藏线性布局
【发布时间】:2016-09-20 18:03:56
【问题描述】:

我有一个应用程序屏幕,其中有一个 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;
                    }

                }
            });

【问题讨论】:

    标签: android webview onscrolllistener


    【解决方案1】:

    您可以通过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()));
    

    希望对你有帮助。

    【讨论】:

    • 这只是显示/隐藏而不是逐渐显示/隐藏?
    【解决方案2】:
    1. 将您的根 view 设为 CoordinatorLayout

    2. 将您的内容包装到NestedScrollView

    3. 在您的底部添加以下View

      app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"&gt;

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多