Java 使用NavigationDrawer进行滑动布局
我将使用以下名为ObservableScrollView的库处理带有滑动选项卡的导航抽屉 . 下面是我用来显示的xml和java文件 我的XML文件: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
<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();
}