此Demo为上一个Demo JYTabLayout的延伸。主要实现功能为ToolBar的隐藏和折叠。JYTabLayout
先上UI图(无图说个XX啊)
AndroidUI
HiddenToolBar
FoldingToolBar
录屏的时候录屏软件渲染有问题,凑合着看吧。
- 此Demo是JYTabLayout的延伸,列表的展示等代码就不在细说。
配置build.gradle:
dependencies {
...
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
}
HiddenToolBar
实现ToolBar的隐藏效果,使用系统的控件:CoordinatorLayout。CoordinatorLayout是Android Design Support Library 中比较难的控件。其为用来组织其子View之间协作的一个父View。ConrdinatorLayout默认情况下可被理解为一个FragLayout。
- 布局文件 我们将根布局LinearLayout更换为CoordinatorLayout。代码如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="#ADBE107E"
app:tabMode="scrollable">
</android.support.design.widget.TabLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v4.view.ViewPager>
</android.support.design.widget.CoordinatorLayout>
此布局中能实现隐藏ToolBar的关键是 ToolBar中 app:layout_scrollFlags="scroll|enterAlways" 标签,必须至少使用scroll这个Flag,这样ToolBar这个View才会滚出屏幕。
还有一点:需要将下面滑动的RecyclerView或者其他任意支持嵌套滚动的View添加 app:layout_behavior="@string/appbar_scrolling_view_behavior" 这个属性。这样才能在下面View发生滑动事件的时候,AppBarLayout接收到View的滑动/滚动事件。
例如:上面中如果ViewPager不添加app:layout_behavior="@string/appbar_scrolling_view_behavior"这个属性的话,运行代码后滑动效果是 先将ToolBar向上滑动至隐藏效果,然后下面的View才会向上滑动,无法做到下面的View和上面的ToolBar同时滑动。
Java中什么都不做什么改变,依旧是为ViewPager设置数据,将TabLayout与ViewPager关联起来,给TabLayout设置适配器。部分代码如下(具体可看JYTabLayout):
private void initViewPager() {
List<String> titles = new ArrayList<>();
for (int i = 0 ; i < mStrings.length ; i ++) {
titles.add(mStrings[i]);
}
List<Fragment> fragments = new ArrayList<>();
for (int i = 0 ; i < mStrings.length ; i ++) {
fragments.add(new ListFragment());
}
FragmentAdapter fragmentAdapter = new FragmentAdapter(getSupportFragmentManager(), titles, fragments);
//给ViewPager设置适配器
mViewPager.setAdapter(fragmentAdapter);
//将TabLayout和ViewPager关联起来。
mTabLayout.setupWithViewPager(mViewPager);
//给TabLayout设置适配器
mTabLayout.setTabsFromPagerAdapter(fragmentAdapter);
}
FoldingToolBar
要实现ToolBar折叠效果,需要引入新的布局 CollapsingToolbarLayout,其作用是提供了一个可以折叠的ToolBar。CollapsingToolbarLayout继承自FrameLayout。
先上布局文件代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
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:fitsSystemWindows="true"
>
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="200dp"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collToolBarLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/backdrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:src="@drawable/mao"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v7.widget.RecyclerView>
</android.support.design.widget.CoordinatorLayout>
其中需要注意的是 CollapsingToolbarLayout 的 app:layout_scrollFlags 属性,是控制包含在 CollapsingToolbarLayout 中控件在响应 下部View layout_behavior滑动事件 时做出响应的 scrollFlags滚动事件。
CollapsingToolbarLayout的几个关键属性简单说一下:
- app:contentScrim="" 用来设置CollapsingToolbarLayout收缩后到顶部的颜色。
- app:expandedTitleGravity="left|bottom" 表示将此CollaspingToolbarLayout完全展开后,title所处的位置,默认值为:"left|bottom"。
- app:collapsedTitleGravity="left" 表示当头部的衬图ImageView 消失后,此title将回归到Toolbar的位置,默认值为left。
- app:layout_scrollFlags="" 此属性用来设置滚动事件,属性里必须至少有scroll这个Flag,这样此View才能滚出屏幕。此处我们使用的是 scroll|exitUntilCollapsed ,这样就能实现折叠效果。如果向实现隐藏效果,可以设置 scroll|enterAlways 。
ImageView控件中:
- layout_collapseMode 有两个值,pin 和 parallax。设置为pin的模式时,当CollapsingToolbarLayout完全收缩后,Toolbar还可以保留在屏幕上。当设置为parallax 模式时,在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,实现视差滚动效果,通常和layout_collapseParallaxMultiplier(设置视差因子)搭配使用。
- layout_collapseParallaxMultiplier(视差因子) - 设置视差滚动因子,值为:0~1。
Toolbar控件中:
- layout_collapseMode 我们设置为 pin 模式。
Java代码中:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_toolbarfolding);
mToolbar = (Toolbar) findViewById(R.id.toolBar);
setSupportActionBar(mToolbar);
CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collToolBarLayout);
collapsingToolbarLayout.setTitle("哆啦A梦");
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(new RecyclerViewAdapter(this));
collapsingToolbarLayout.setExpandedTitleColor(Color.WHITE);//设置还没收缩时状态下字体颜色
collapsingToolbarLayout.setCollapsedTitleTextColor(Color.GREEN);//设置收缩后Toolbar上字体的颜色
}
-
注意:使用CollapsingToolbarLayout时必须把title设置到CollapsingToolbarLayout上,设置到Toolbar上不会显示。如:collapsingToolbarLayout.setTitle("哆啦A梦");
-
设置Title文字渐变颜色(系统会自动帮我们过渡):
collapsingToolbarLayout.setExpandedTitleColor(Color.WHITE);//设置还没收缩时状态下字体颜色
collapsingToolbarLayout.setCollapsedTitleTextColor(Color.GREEN);//设置收缩后Toolbar上字体的颜色
网友评论