Java 使用NavigationDrawer进行滑动布局

Java 使用NavigationDrawer进行滑动布局,java,android,navigation-drawer,pagerslidingtabstrip,Java,Android,Navigation Drawer,Pagerslidingtabstrip,我将使用以下名为ObservableScrollView的库处理带有滑动选项卡的导航抽屉 . 下面是我用来显示的xml和java文件 我的XML文件: <com.para.paraservice.observablescrollview.TouchInterceptionFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.co

我将使用以下名为ObservableScrollView的库处理带有滑动选项卡的导航抽屉 . 下面是我用来显示的xml和java文件

我的XML文件:

<com.para.paraservice.observablescrollview.TouchInterceptionFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/pager_wrapper"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>
<RelativeLayout
    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.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            app:popupTheme="@style/Theme.AppCompat.Light.DarkActionBar"
            app:theme="@style/Toolbar" />
        <com.para.paraservice.widgets.SlidingTabLayout
            android:id="@+id/sliding_tabs"
            android:layout_width="match_parent"
            android:layout_height="@dimen/tab_height"
            android:background="@color/primary"
            android:layout_below="@+id/toolbar" />
        <android.support.v4.widget.DrawerLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/drawer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/toolbar" >

            <FrameLayout
                android:id="@+id/fr_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clickable="true" />

            <!-- android:layout_marginTop="?android:attr/actionBarSize" -->

            <fragment
                android:id="@+id/fragment_drawer"
                android:name="com.para.paraservice.widgets.NavigationDrawerFragment"
                android:layout_width="@dimen/flexible_space_image_height"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                app:layout="@layout/fragment_navigation_drawer" />
        </android.support.v4.widget.DrawerLayout>
    </RelativeLayout>

</com.para.paraservice.observablescrollview.TouchInterceptionFrameLayout>

我的Java代码:

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.Toolbar;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.FrameLayout;
import android.widget.Toast;

import com.nineoldandroids.animation.ValueAnimator;
import com.nineoldandroids.view.ViewHelper;
import com.para.paraservice.BaseActivity;
import com.para.paraservice.R;
import com.para.paraservice.ViewPagerTab2ScrollViewFragment;
import com.para.paraservice.observablescrollview.ObservableScrollViewCallbacks;
import com.para.paraservice.observablescrollview.CacheFragmentStatePagerAdapter;
import com.para.paraservice.observablescrollview.ScrollState;
import com.para.paraservice.observablescrollview.ScrollUtils;
import com.para.paraservice.observablescrollview.Scrollable;
import com.para.paraservice.observablescrollview.TouchInterceptionFrameLayout;
import com.para.paraservice.widgets.NavigationDrawerCallbacks;
import com.para.paraservice.widgets.NavigationDrawerFragment;
import com.para.paraservice.widgets.SlidingTabLayout;

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @SuppressLint("NewApi")
    public class LandingActivity extends BaseActivity implements ObservableScrollViewCallbacks,
            NavigationDrawerCallbacks {
        private Toolbar mToolbar;
        private View mToolbarView;
        private TouchInterceptionFrameLayout mInterceptionLayout;
        private ViewPager mPager;
        private NavigationAdapter mPagerAdapter;
        private int mSlop;
        private boolean mScrolled;
        private ScrollState mLastScrollState;
        private NavigationDrawerFragment mNavigationDrawerFragment;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.landing);

            mToolbar = (Toolbar) findViewById(R.id.toolbar);
            mToolbarView = findViewById(R.id.toolbar);
            setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
            getSupportActionBar().setTitle("PARA");
            getSupportActionBar().setDisplayShowHomeEnabled(true);

            ViewCompat.setElevation(findViewById(R.id.header), getResources().getDimension(R.dimen.toolbar_elevation));
            mPagerAdapter = new NavigationAdapter(getSupportFragmentManager());
            mPager = (ViewPager) findViewById(R.id.pager);
            mPager.setAdapter(mPagerAdapter);

            final int tabHeight = getResources().getDimensionPixelSize(R.dimen.tab_height);
            findViewById(R.id.pager_wrapper).setPadding(0, getActionBarSize() + tabHeight, 0, 0);

            SlidingTabLayout slidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
            slidingTabLayout.setCustomTabView(R.layout.tab_indicator, android.R.id.text1);
            slidingTabLayout.setSelectedIndicatorColors(getResources().getColor(R.color.accent));
            slidingTabLayout.setDistributeEvenly(true);
            slidingTabLayout.setViewPager(mPager);

            ViewConfiguration vc = ViewConfiguration.get(this);
            mSlop = vc.getScaledTouchSlop();
            mInterceptionLayout = (TouchInterceptionFrameLayout) findViewById(R.id.container);
            mInterceptionLayout.setScrollInterceptionListener(mInterceptionListener);


            mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager()
                    .findFragmentById(R.id.fragment_drawer);
            mNavigationDrawerFragment.setup(R.id.fragment_drawer,
                    (DrawerLayout) findViewById(R.id.drawer), mToolbar);

        }
        @Override
        public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {
        }

        @Override
        public void onDownMotionEvent() {
        }

        @Override
        public void onUpOrCancelMotionEvent(ScrollState scrollState) {
            if (!mScrolled) {
                // This event can be used only when TouchInterceptionFrameLayout
                // doesn't handle the consecutive events.
                adjustToolbar(scrollState);
            }
        }

        private TouchInterceptionFrameLayout.TouchInterceptionListener mInterceptionListener = new TouchInterceptionFrameLayout.TouchInterceptionListener() {
            @Override
            public boolean shouldInterceptTouchEvent(MotionEvent ev, boolean moving, float diffX, float diffY) {
                if (!mScrolled && mSlop < Math.abs(diffX) && Math.abs(diffY) < Math.abs(diffX)) {
                    // Horizontal scroll is maybe handled by ViewPager
                    return false;
                }

                Scrollable scrollable = getCurrentScrollable();
                if (scrollable == null) {
                    mScrolled = false;
                    return false;
                }

                // If interceptionLayout can move, it should intercept.
                // And once it begins to move, horizontal scroll shouldn't work any longer.
                int toolbarHeight = mToolbarView.getHeight();
                int translationY = (int) ViewHelper.getTranslationY(mInterceptionLayout);
                boolean scrollingUp = 0 < diffY;
                boolean scrollingDown = diffY < 0;
                if (scrollingUp) {
                    if (translationY < 0) {
                        mScrolled = true;
                        mLastScrollState = ScrollState.UP;
                        return true;
                    }
                } else if (scrollingDown) {
                    if (-toolbarHeight < translationY) {
                        mScrolled = true;
                        mLastScrollState = ScrollState.DOWN;
                        return true;
                    }
                }
                mScrolled = false;
                return false;
            }

            @Override
            public void onDownMotionEvent(MotionEvent ev) {
            }

            @Override
            public void onMoveMotionEvent(MotionEvent ev, float diffX, float diffY) {
                float translationY = ScrollUtils.getFloat(ViewHelper.getTranslationY(mInterceptionLayout) + diffY, -mToolbarView.getHeight(), 0);
                ViewHelper.setTranslationY(mInterceptionLayout, translationY);
                if (translationY < 0) {
                    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mInterceptionLayout.getLayoutParams();
                    lp.height = (int) (-translationY + getScreenHeight());
                    mInterceptionLayout.requestLayout();
                }
            }

            @Override
            public void onUpOrCancelMotionEvent(MotionEvent ev) {
                mScrolled = false;
                adjustToolbar(mLastScrollState);
            }
        };

        private Scrollable getCurrentScrollable() {
            Fragment fragment = getCurrentFragment();
            if (fragment == null) {
                return null;
            }
            View view = fragment.getView();
            if (view == null) {
                return null;
            }
            return (Scrollable) view.findViewById(R.id.scroll);
        }

        private void adjustToolbar(ScrollState scrollState) {
            int toolbarHeight = mToolbarView.getHeight();
            final Scrollable scrollable = getCurrentScrollable();
            if (scrollable == null) {
                return;
            }
            int scrollY = scrollable.getCurrentScrollY();
            if (scrollState == ScrollState.DOWN) {
                showToolbar();
            } else if (scrollState == ScrollState.UP) {
                if (toolbarHeight <= scrollY) {
                    hideToolbar();
                } else {
                    showToolbar();
                }
            } else if (!toolbarIsShown() && !toolbarIsHidden()) {
                // Toolbar is moving but doesn't know which to move:
                // you can change this to hideToolbar()
                showToolbar();
            }
        }

        private Fragment getCurrentFragment() {
            return mPagerAdapter.getItemAt(mPager.getCurrentItem());
        }

        private boolean toolbarIsShown() {
            return ViewHelper.getTranslationY(mInterceptionLayout) == 0;
        }

        private boolean toolbarIsHidden() {
            return ViewHelper.getTranslationY(mInterceptionLayout) == -mToolbarView.getHeight();
        }

        private void showToolbar() {
            animateToolbar(0);
        }

        private void hideToolbar() {
            animateToolbar(-mToolbarView.getHeight());
        }

        private void animateToolbar(final float toY) {
            float layoutTranslationY = ViewHelper.getTranslationY(mInterceptionLayout);
            if (layoutTranslationY != toY) {
                ValueAnimator animator = ValueAnimator.ofFloat(ViewHelper.getTranslationY(mInterceptionLayout), toY).setDuration(200);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        float translationY = (float) animation.getAnimatedValue();
                        ViewHelper.setTranslationY(mInterceptionLayout, translationY);
                        if (translationY < 0) {
                            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mInterceptionLayout.getLayoutParams();
                            lp.height = (int) (-translationY + getScreenHeight());
                            mInterceptionLayout.requestLayout();
                        }
                    }
                });
                animator.start();
            }
        }

        @Override
        public void onNavigationDrawerItemSelected(int position) {
            Toast.makeText(this, "Menu item selected -> " + position,
                    Toast.LENGTH_SHORT).show();
        }

        @SuppressLint("NewApi")
        @Override
        public void onBackPressed() {
            if (mNavigationDrawerFragment.isDrawerOpen())
                mNavigationDrawerFragment.closeDrawer();
            else
                super.onBackPressed();
        }

         /**
         * This adapter provides two types of fragments as an example.
         * {@linkplain #createItem(int)} should be modified if you use this example for your app.
         */
        private static class NavigationAdapter extends CacheFragmentStatePagerAdapter {

            private static final String[] TITLES = new String[]{"Applepie", "Butter Cookie", "Cupcake", "Donut", "Eclair", "Froyo", "Gingerbread", "Honeycomb", "Ice Cream Sandwich", "Jelly Bean", "KitKat", "Lollipop"};

            public NavigationAdapter(FragmentManager fm) {
                super(fm);
            }

            @Override
            protected Fragment createItem(int position) {
                Fragment f;
                final int pattern = position % 5;
                switch (pattern) {
                    case 0:
                        f = new ViewPagerTab2ScrollViewFragment();
                        break;
                    case 1:
    //                    f = new ViewPagerTab2ListViewFragment();
                        f = new ViewPagerTab2ScrollViewFragment();
                        break;
                    case 2:
    //                    f = new ViewPagerTab2RecyclerViewFragment();
                        f = new ViewPagerTab2ScrollViewFragment();
                        break;
                    case 3:
    //                    f = new ViewPagerTab2GridViewFragment();
                        f = new ViewPagerTab2ScrollViewFragment();
                        break;
                    case 4:
                    default:
                        f = new ViewPagerTab2ScrollViewFragment();
    //                    f = new ViewPagerTab2WebViewFragment();
                        break;
                }
                return f;
            }

            @Override
            public int getCount() {
                return TITLES.length;
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return TITLES[position];
            }
        }

    }
导入android.annotation.SuppressLint;
导入android.annotation.TargetApi;
导入android.os.Build;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentManager;
导入android.support.v4.view.ViewCompat;
导入android.support.v4.view.ViewPager;
导入android.support.v4.widget.DrawerLayout;
导入android.support.v7.widget.Toolbar;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.ViewConfiguration;
导入android.widget.FrameLayout;
导入android.widget.Toast;
导入com.nineodeldroids.animation.ValueAnimator;
导入com.nineodeldroids.view.ViewHelper;
导入com.para.paraservice.BaseActivity;
导入com.para.paraservice.R;
导入com.para.paraservice.ViewPagerTab2ScrollViewFragment;
导入com.para.paraservice.observatescrollview.observatescrollview回调;
导入com.para.paraservice.observeScrollView.CacheFragmentStatePagerAdapter;
导入com.para.paraservice.observatescrollview.ScrollState;
导入com.para.paraservice.observatescrollview.ScrollUtils;
导入com.para.paraservice.observatescrollview.Scrollable;
导入com.para.paraservice.observeScrollView.TouchInterceptionFrameLayout;
导入com.para.paraservice.widgets.NavigationDrawerCallbacks;
导入com.para.paraservice.widgets.NavigationDrawerFragment;
导入com.para.paraservice.widgets.SlidingTabLayout;
@TargetApi(构建版本代码蜂窝)
@SuppressLint(“新API”)
公共类LandingActivity扩展BaseActivity实现ObservablesRollViewCallbacks,
导航抽屉回调{
私有工具栏mToolbar;
私有视图mToolbarView;
私有触摸截取框架布局mInterceptionLayout;
私人寻呼机;
私人导航适配器;
私人内部mSlop;
私有布尔值;
私有ScrollState mLastScrollState;
私人导航抽屉碎片mnavigation抽屉碎片;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局着陆);
mToolbar=(工具栏)findviewbyd(R.id.Toolbar);
mToolbarView=findviewbyd(R.id.toolbar);
setSupportActionBar((工具栏)findViewById(R.id.Toolbar));
getSupportActionBar().setTitle(“段落”);
getSupportActionBar().setDisplayShowHomeEnabled(true);
setElevation(findViewById(R.id.header),getResources().getDimension(R.dimen.toolbar_-elevation));
mPagerAdapter=新导航适配器(getSupportFragmentManager());
mPager=(ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mPagerAdapter);
final int tabHeight=getResources().getDimensionPixelSize(R.dimen.tab_height);
findviewbyd(R.id.pager_wrapper).setPadding(0,getActionBarSize()+tabHeight,0,0);
SlidingTabLayout SlidingTabLayout=(SlidingTabLayout)findViewById(R.id.sliding_选项卡);
slidingTabLayout.setCustomTabView(R.layout.tab_指示器,android.R.id.text1);
slidingTabLayout.setSelectedIndicator颜色(getResources().getColor(R.color.accent));
slidingTabLayout.setDistributeEvenly(true);
slidingTabLayout.setViewPager(mPager);
ViewConfiguration vc=ViewConfiguration.get(这个);
mSlop=vc.getScaledTouchSlop();
mInterceptionLayout=(TouchInterceptionFrameLayout)findViewById(R.id.container);
mInterceptionLayout.SetScrolInterceptionListener(mInterceptionListener);
mNavigationDrawerFragment=(NavigationDrawerFragment)getFragmentManager()
.findFragmentById(R.id.fragment_抽屉);
mNavigationDrawerFragment.setup(R.id.fragment\u drawer,
(抽屉布局)findViewById(R.id.抽屉),mToolbar);
}
@凌驾
public void onScrollChanged(整型滚动、布尔型第一滚动、布尔型拖动){
}
@凌驾
公共无效onDownMotionEvent(){
}
@凌驾
public void onProcencelMotionEvent(ScrollState ScrollState){
如果(!mScrolled){
//此事件只能在TouchInterceptionFrameLayout时使用
//不处理连续事件。
调整工具栏(滚动状态);
}
}
私有TouchInterceptionFrameLayout.TouchInterceptionListener mInterceptionListener=新建TouchInterceptionFrameLayout.TouchInterceptionListener(){
@凌驾
公共布尔值shouldInterceptTouchEvent(运动事件ev、布尔值移动、浮点diffX、浮点diffY){
如果(!mScrolled&&mSlop<FrameLayout 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.support.v4.widget.DrawerLayout
        android:id="@+id/drawer"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar_actionbar">

        <!--<FrameLayout android:id="@+id/container" android:layout_width="match_parent"-->
        <!--android:clickable="true" android:layout_height="match_parent" />-->

        <!--
    Padding for ViewPager must be set outside the ViewPager itself
    because with padding, EdgeEffect of ViewPager become strange.
    -->
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v4.view.ViewPager
                android:id="@+id/pager"
                android:paddingTop="@dimen/tab_height"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

            <LinearLayout
                android:id="@+id/header"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="?attr/colorPrimary"
                android:orientation="vertical">

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="?attr/colorPrimary"
                    android:minHeight="?attr/actionBarSize"
                    app:popupTheme="@style/Theme.AppCompat.Light.DarkActionBar"
                    app:theme="@style/Toolbar" />

                <com.google.samples.apps.iosched.ui.widget.SlidingTabLayout
                    android:id="@+id/sliding_tabs"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/tab_height"
                    android:background="@color/primary" />
            </LinearLayout>
        </FrameLayout>
        <!-- android:layout_marginTop="?android:attr/actionBarSize"-->
        <fragment
            android:id="@+id/fragment_drawer"
            android:name="com.github.ksoichiro.android.observablescrollview.samples.NavigationDrawerFragment"
            android:layout_width="280dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:layout="@layout/fragment_navigation_drawer" />
    </android.support.v4.widget.DrawerLayout>
</FrameLayout>
public class ViewPagerTabListViewActivity extends BaseActivity implements ObservableScrollViewCallbacks, NavigationDrawerCallbacks {

private View mHeaderView;
private View mToolbarView;
private int mBaseTranslationY;
private ViewPager mPager;
private NavigationAdapter mPagerAdapter;

private NavigationDrawerFragment mNavigationDrawerFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_viewpagertab);

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar));

    mHeaderView = findViewById(R.id.header);
    ViewCompat.setElevation(mHeaderView, getResources().getDimension(R.dimen.toolbar_elevation));
    mToolbarView = findViewById(R.id.toolbar);
    mPagerAdapter = new NavigationAdapter(getSupportFragmentManager());
    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mPagerAdapter);

    SlidingTabLayout slidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
    slidingTabLayout.setCustomTabView(R.layout.tab_indicator, android.R.id.text1);
    slidingTabLayout.setSelectedIndicatorColors(getResources().getColor(R.color.accent));
    slidingTabLayout.setDistributeEvenly(true);
    slidingTabLayout.setViewPager(mPager);

    // When the page is selected, other fragments' scrollY should be adjusted
    // according to the toolbar status(shown/hidden)
    slidingTabLayout.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {
        }

        @Override
        public void onPageSelected(int i) {
            propagateToolbarState(toolbarIsShown());
        }

        @Override
        public void onPageScrollStateChanged(int i) {
        }
    });

    propagateToolbarState(toolbarIsShown());

    //Added this --------------------------------------------

    ActionBar ab = getSupportActionBar();
    ab.setDisplayShowHomeEnabled(false);
    ab.setDisplayHomeAsUpEnabled(true);
    ab.setHomeButtonEnabled(true);
    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getSupportFragmentManager().findFragmentById(R.id.fragment_drawer);

    // Set up the drawer.
    mNavigationDrawerFragment.setup(R.id.fragment_drawer, (DrawerLayout) findViewById(R.id.drawer), (Toolbar) mToolbarView);
}

//Added this -----------------------------------------

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    Toast.makeText(this, "Menu item selected -> " + position, Toast.LENGTH_SHORT).show();
}