在滑动垂直viewPager上隐藏actionBar [英] hide actionBar on Swipe vertical viewPager

查看:96
本文介绍了在滑动垂直viewPager上隐藏actionBar的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用垂直ViewPager在Swipe上隐藏My ActionBar/工具栏,这是我的MainActivity XML:

I'm trying to hide My ActionBar/toolbar on Swipe using a vertical ViewPager, this is my MainActivity XML:

 <android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:ignore="InconsistentLayout">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinator_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true">

            <include
                android:id="@+id/toolbar"
                layout="@layout/view_toolbar" />

        </android.support.design.widget.AppBarLayout>

        <include layout="@layout/view_home" />

    </android.support.design.widget.CoordinatorLayout>

    <include layout="@layout/view_left_drawer" />

</android.support.v4.widget.DrawerLayout>

我已添加到工具栏:app:layout_scrollFlags="scroll|enterAlways"

我的片段中只有空白页,ViewPager不可见:

i have only Blank page in my Fragment, the ViewPager not visible:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:isScrollContainer="false"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_vertical"
android:background="@color/greeen_theme"
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:background="@color/light_theme_color_read"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

<Button
    android:id="@+id/refreshListBtn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="5dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="10dp"
    android:background="@drawable/bg_refresh_list_button_selector"
    android:textColor="@android:color/white"
    android:visibility="visible"/>

<com.axample.android.view.SwipeRefreshLayout
    android:id="@+id/swiperefresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <com.axample.android.adapter.vertical.VerticalViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="@dimen/pager_padd_botom"
            android:clipToPadding="false"/>

</com.axample.android.view.SwipeRefreshLayout>

</RelativeLayout>

</android.support.v4.widget.NestedScrollView>

视频: https://www.youtube.com/watch?v=sWknAZFs6RA

请帮助!

更新:我的view_left_drawer.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         android:id="@+id/left_drawer"
         android:layout_width="240dp"
         android:layout_height="match_parent"
         android:layout_gravity="start"
         android:background="@color/black_main"
         tools:showIn="@layout/activity_home">

<include layout="@layout/view_drawer_content"/>
</FrameLayout>

我的SwipeRefreshLayout: https://github.com/FredJul/Flym/blob/master/Flym/src/main/java/net/fred/feedex/view/SwipeRefreshLayout.java

推荐答案

通常,我使用这段代码(请参见下文).但这为另一种布局做好了准备.您可以尝试使其适应您的布局.

Normally I use this piece of code (see below). But this is prepared for another type of layout. You can try to adapt it to your layout.

 public static class ShowHideToolbarOnScrollingListener implements MyNestedScrollView.ScrollViewListener{

    private Toolbar toolbar;
    private State state;
    private float toolbarElevation;

    public ShowHideToolbarOnScrollingListener(Toolbar toolbar, float toolbarElevation) {
        this.toolbar = toolbar;
        this.state = new State();
        this.toolbarElevation = toolbarElevation;
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    private void toolbarSetElevation(float elevation) {
        if (AndroidUtils.isLollipop()) {
            toolbar.setElevation(elevation == 0 ? 1 : toolbarElevation);
        }
    }

    private void toolbarAnimateShow(final int verticalOffset) {
        toolbar.animate()
                .translationY(0)
                .setInterpolator(new LinearInterpolator())
                .setDuration(180)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                        toolbarSetElevation(verticalOffset == 0 ? 1 : toolbarElevation);
                    }
                });
    }

    private void toolbarAnimateHide() {
        toolbar.animate()
                .translationY(-toolbar.getHeight())
                .setInterpolator(new LinearInterpolator())
                .setDuration(180)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        toolbarSetElevation(1);
                    }
                });
    }




    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public void onRestoreInstanceState(State state) {
        this.state.verticalOffset = state.verticalOffset;
        this.state.scrollingOffset = state.scrollingOffset;
        if (AndroidUtils.isLollipop()) {
            toolbar.setElevation(state.elevation);
            toolbar.setTranslationY(state.translationY);
        }
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public State onSaveInstanceState() {
        state.translationY = toolbar.getTranslationY();
        if (AndroidUtils.isLollipop()) {
            state.elevation = toolbar.getElevation();
        }
        return state;
    }



    @Override
    public void onScrollChanged(MyNestedScrollView v, int x, int y, int oldx, int oldy) {
        int dy = y-oldy;
        Log.d("dy", ""+dy);
        state.verticalOffset = v.computeVerticalScrollOffset();
        state.scrollingOffset = dy;
        int toolbarYOffset = (int) (dy - toolbar.getTranslationY());
        toolbar.animate().cancel();
        if (state.scrollingOffset > 0) {
            if (toolbarYOffset < toolbar.getHeight()) {
                if (state.verticalOffset > toolbar.getHeight()) {
                    toolbarSetElevation(toolbarElevation);
                }
                toolbar.setTranslationY(state.translationY = -toolbarYOffset);
            } else {
                toolbarSetElevation(1);
                toolbar.setTranslationY(state.translationY = -toolbar.getHeight());
            }
        } else if (state.scrollingOffset < 0) {
            if (toolbarYOffset < 0) {
                if (state.verticalOffset <= 0) {
                    toolbarSetElevation(1);
                }
                toolbar.setTranslationY(state.translationY = 0);
            } else {
                if (state.verticalOffset > toolbar.getHeight()) {
                    toolbarSetElevation(toolbarElevation);
                }
                toolbar.setTranslationY(state.translationY = -toolbarYOffset);
            }
        }
    }

    @Override
    public void onEndScroll() {
        if (state.scrollingOffset > 0) {
            if (state.verticalOffset > toolbar.getHeight()) {
                toolbarAnimateHide();
            } else {
                toolbarAnimateShow(state.verticalOffset);
            }
        } else if (state.scrollingOffset < 0) {
            if (toolbar.getTranslationY() < toolbar.getHeight() * -0.6 && state.verticalOffset > toolbar.getHeight()) {
                toolbarAnimateHide();
            } else {
                toolbarAnimateShow(state.verticalOffset);
            }
        }
    }


    /**
     * Parcelable RecyclerView/Toolbar state for simpler saving/restoring its current state.
     */
    public static final class State implements Parcelable {
        public static Creator<State> CREATOR = new Creator<State>() {
            public State createFromParcel(Parcel parcel) {
                return new State(parcel);
            }

            public State[] newArray(int size) {
                return new State[size];
            }
        };

        // Keeps track of the overall vertical offset in the list
        private int verticalOffset;
        // Determines the scroll UP/DOWN offset
        private int scrollingOffset;
        // Toolbar values
        private float translationY;
        private float elevation;

        State() {
        }

        State(Parcel parcel) {
            this.verticalOffset = parcel.readInt();
            this.scrollingOffset = parcel.readInt();
            this.translationY = parcel.readFloat();
            this.elevation = parcel.readFloat();
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel parcel, int flags) {
            parcel.writeInt(verticalOffset);
            parcel.writeInt(scrollingOffset);
            parcel.writeFloat(translationY);
            parcel.writeFloat(elevation);
        }
    }
}

这篇关于在滑动垂直viewPager上隐藏actionBar的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆