簡體   English   中英

如何在不使用nestedScrollView的情況下在Webview滾動條上隱藏和顯示FAB

[英]How to hide and show FAB on scroll of webview without using nestedScrollView

這是我的XML布局中的一個浮動操作按鈕。

我在NestedScrollView中的Webview導致收縮縮放支持崩潰。

<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:src="@drawable/filter_icon"
    android:tint="#FFFFFF"
    app:backgroundTint="@color/colorPrimary"
    app:elevation="4dp"
    app:fabSize="normal"
    app:useCompatPadding="true"
    app:layout_anchorGravity="bottom|end|right"
    app:layout_behavior=".ScrollAwareFABBehavior">
</android.support.design.widget.FloatingActionButton>

完整的工作代碼,無需使用NestedScrollView即可隱藏和顯示Webview滾動上的FAB。

public class NestedWebView extends WebView {

    private OnScrollChangedCallback  mOnScrollChangedCallback;

    public NestedWebView(Context context) {
        super(context);
    }

    public NestedWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NestedWebView(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);
        if (mOnScrollChangedCallback != null) {
            mOnScrollChangedCallback.onScrollChange(this, l, t, oldl, oldt);
        }

    }

    public void setOnScrollChangedCallback(final OnScrollChangedCallback mOnScrollChangedCallback) {
        this.mOnScrollChangedCallback = mOnScrollChangedCallback;
    }

    public OnScrollChangedCallback getOnScrollChangedCallback() {
        return mOnScrollChangedCallback;
    }

    public interface OnScrollChangedCallback {
        /**
         * Called when the scroll position of a view changes.
         *
         * @param v          The view whose scroll position has changed.
         * @param scrollX    Current horizontal scroll origin.
         * @param scrollY    Current vertical scroll origin.
         * @param oldScrollX Previous horizontal scroll origin.
         * @param oldScrollY Previous vertical scroll origin.
         */
        void onScrollChange(WebView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY);
    }
}

在xml中使用這樣的自定義Webview,

<com.essence.linuxcommands.NestedWebView
                android:id="@+id/myWebView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:elevation="@dimen/card_margin"
                android:scrollbarStyle="outsideOverlay"
                android:shadowRadius="2"
                android:visibility="gone"
            />

活動中或片段中

NestedWebView webview = (NestedWebView) rootView.findViewById(R.id.myWebView);
webview.setOnScrollChangedCallback(new NestedWebView.OnScrollChangedCallback() {
           @Override
           public void onScrollChange(WebView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
               if (scrollY > oldScrollY && scrollY > 0) {
                   fab.hide();
               }
               if (scrollY < oldScrollY) {
                   fab.show();
               }
           }
       });

行為班

public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {


    public ScrollAwareFABBehavior() {
        super();
    }

    public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private int mXonTouchDown;
    private int mXonTouchUp;

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, FloatingActionButton child, MotionEvent ev) {


        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            mXonTouchDown = (int) ev.getY();
        } else if (ev.getAction() == MotionEvent.ACTION_UP) {
            mXonTouchUp = (int) ev.getY();
        }
        if(mXonTouchDown > mXonTouchUp)
            child.hide();
        else
            child.show();

        return super.onInterceptTouchEvent(parent, child, ev);
    }
}

您可以做到這一點創建新的類名稱TouchyWebView

package your.package.name;

public class TouchyWebView extends WebView {

        public TouchyWebView(Context context) {
            super(context);
        }

        public TouchyWebView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public TouchyWebView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            requestDisallowInterceptTouchEvent(true);
            int action = event.getActionMasked();
            String TAG = ActivityName.class.getSimpleName();
            float initialX = 0, initialY = 0;
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    initialX = event.getX();
                    initialY = event.getY();
                    Log.d(TAG, "Action was DOWN");
                    break;

                case MotionEvent.ACTION_MOVE:
                    Log.d(TAG, "Action was MOVE");
                    break;

                case MotionEvent.ACTION_UP:
                    float finalX = event.getX();
                    float finalY = event.getY();
                    Log.d(TAG, "Action was UP");
                    if (initialX < finalX) {
                        Log.d(TAG, "Left to Right swipe performed");
                    }
                    if (initialX > finalX) {
                        Log.d(TAG, "Right to Left swipe performed");
                    }
                    if (initialY < finalY) {
                        Log.d(TAG, "Up to Down swipe performed");
                        // hide or show fab button here?
                        //fab.hide();
                    }
                    if (initialY > finalY) {
                        Log.d(TAG, "Down to Up swipe performed");
                        // hide or show fab button here?
                        //fab.show();
                    }
                    break;
                case MotionEvent.ACTION_CANCEL:
                    Log.d(TAG, "Action was CANCEL");
                    break;

                case MotionEvent.ACTION_OUTSIDE:
                    Log.d(TAG, "Movement occurred outside bounds of current screen element");
                    break;
            }

            return super.onTouchEvent(event);
        }
    }

現在,而不是使用新創建的XML的Webview,如下所示

您的WebView:

<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/webview"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
/>

替換為:

<your.package.name.TouchyWebView 
  android:id="@+id/description_web"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"/>

現在您的webview對象就像

WebView webview = (WebView)findViewById(R.id.webView);

改成

TouchyWebView touchyWebView = (TouchyWebView) findViewById(R.id.description_web);

webView Touchy

 final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.myFAB);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            webview.setOnScrollChangeListener(new View.OnScrollChangeListener() {
                @Override
                public void onScrollChange(View Webview,int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                    if (scrollY > oldScrollY && scrollY > 0) {
                        fab.hide();
                    }
                    if (scrollY < oldScrollY) {
                        fab.show();
                    }
                }

            });

暫無
暫無

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

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