安卓Design包之CollapsingToolbarLayout(可折叠的工具栏布局)的简单使用
转自:
CollapsingToolbarLayout的使用
注意:使用前需要添加Design依赖包,使用toolbar时需要隐藏标题头
CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout_scrollFlags,它可以控制包含在CollapsingToolbarLayout中的控件(如:ImageView、Toolbar)在响应layout_behavior事件时作出相应的scrollFlags滚动事件(移除屏幕或固定在屏幕顶端)。
NestedScrollView:它是support-v4包提供的控件,继承至FrameLayout, 并实现了NestedScrollingParent,NestedScrollingChild, ScrollingView接口.
它的作用类似于Android.widget.ScrollView,不同点在于NestedScrollView支持嵌套滑动.
需实现的布局:
最外层是CoorinatorLayout,然后里面包含了AppBarlayout和NestedScrollView
AppBarLayout里包含了CollspsingToolbar和Tableyout,它的作用是可以将所有的子控件都当成一个整体
CollapsingToolbarLayout里面则包含了一个ImageView和ToolBar作为伸缩的区域。
1. AppBarLayout的子布局有5种滚动标识(layout_scrollFlags属性):
- scroll:将此布局和滚动时间关联。这个标识要设置在其他标识之前,没有这个标识则布局不会滚动且其他标识设置无效。
- enterAlways:任何向下滚动操作都会使此布局可见。这个标识通常被称为“快速返回”模式。
- enterAlwaysCollapsed:假设你定义了一个最小高度(minHeight)同时enterAlways也定义了,那么view将在到达这个最小高度的时候开始显示,并且从这个时候开始慢慢展开,当滚动到顶部的时候展开完。
- exitUntilCollapsed:当你定义了一个minHeight,此布局将在滚动到达这个最小高度的时候折叠。
- snap:当一个滚动事件结束,如果视图是部分可见的,那么它将被滚动到收缩或展开。例如,如果视图只有底部25%显示,它将折叠。相反,如果它的底部75%可见,那么它将完全展开。
实践证明,scroll和enterAlwaysCollapsed,scroll和exitUntilCollapsed使用时效果无阴影,scroll和enterAlways配合使用时,效果有阴影。
2.CollapsingToolbarLayout中通过layout_collapseMode属性来指定其内部的子控件是折叠还是固定在屏幕上方。
- <!-- layout_collapseMode(折叠模式)-有两个值:
- 1.parallax:在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,
- 实现视差滚动效果,通常和layout_collapseParallaxMultiplier(设置视差因子)搭配使用。如果不想实现联动效果,可以设置为0,效果就和scrollview一样了
- 2.pin - 当CollapsingToolbarLayout完全收缩后,Toolbar还可以固定在屏幕上。
- -->
xml文件:
- <?xml version="1.0" encoding="utf-8"?>
- <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:orientation="vertical"
- tools:context="fanggao.qf.collapsingtoolbarlayout.MainActivity">
- <!-- android:fitsSystemWindow = "true" 表示整个布局展示是整个屏幕出去状态栏,标题栏和导航栏剩下的区域-->
- <android.support.design.widget.AppBarLayout
- android:id="@+id/layout_appbar"
- android:layout_width="match_parent"
- android:layout_height = "wrap_content"
- >
- <!--
- app:expandedTitleMarginStart="10dp"
- 设置扩张时候(还没有收缩时)title离屏幕左边的距离
- app:contentScrim="?attr/colorPrimary"
- 设置当完全CollapsingToolbarLayout折叠(收缩)后的背景颜色
- -->
- <android.support.design.widget.CollapsingToolbarLayout
- android:id="@+id/ctb"
- android:layout_width="match_parent"
- android:layout_height="250dp"
- android:fitsSystemWindows="true"
- app:contentScrim="?attr/colorPrimary"
- app:expandedTitleMarginStart="10dp"
- app:layout_scrollFlags="scroll|exitUntilCollapsed">
- <ImageView
- android:id="@+id/image"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scaleType="centerCrop"
- app:layout_collapseMode="parallax"
- android:src = "@drawable/cat"
- />
- <!--标题-->
- <android.support.v7.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="30dp"
- app:layout_collapseMode="pin"
- app:title="Toolbar"/>
- </android.support.design.widget.CollapsingToolbarLayout>
- <!--选项卡-->
- <android.support.design.widget.TabLayout
- android:id="@+id/tabLayout"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:tabIndicatorColor="@color/colorAccent"
- app:tabMode="scrollable"
- app:tabSelectedTextColor="@color/colorAccent"
- app:tabTextColor="@android:color/black"/>
- </android.support.design.widget.AppBarLayout>
- <android.support.v4.widget.NestedScrollView
- android:id="@+id/nestedScrollView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- app:layout_behavior="@string/appbar_scrolling_view_behavior">
- <android.support.v4.view.ViewPager
- android:id="@+id/viewPager"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
- </android.support.v4.widget.NestedScrollView>
- </android.support.design.widget.CoordinatorLayout>
主程序:
- public class MainActivity extends AppCompatActivity {
- private Toolbar toolbar;
- private ImageView image;
- private ViewPager viewpager;
- private TabLayout tabLayout;
- private CollapsingToolbarLayout collapsingToolbarLayout;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initView();
- initData();
- }
- private void initData() {
- toolbar.setLogo(R.mipmap.ic_launcher);
- setSupportActionBar(toolbar);
- //设置返回按钮
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- //设置收缩展开toolbar字体颜色
- collapsingToolbarLayout.setExpandedTitleColor(Color.WHITE);
- collapsingToolbarLayout.setCollapsedTitleTextColor(Color.BLACK);
- //设置tablayout与viewPager
- viewpager.setAdapter(new TestViewPageAdapter());
- tabLayout.setupWithViewPager(viewpager);
- }
- private void initView() {
- toolbar = (Toolbar) findViewById(R.id.toolbar);
- image = (ImageView) findViewById(R.id.image);
- viewpager = (ViewPager) findViewById(R.id.viewPager);
- tabLayout = (TabLayout) findViewById(R.id.tabLayout);
- collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.ctb);
- }
- class TestViewPageAdapter extends PagerAdapter{
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- TextView textView = new TextView(MainActivity.this);
- textView.setGravity(Gravity.CENTER);
- textView.setText("pager "+(position+1));
- textView.setTextSize(30);
- textView.setTextColor(Color.BLUE);
- container.addView(textView);
- return textView;
- }
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- container.removeView((View)object);
- }
- @Override
- public int getCount() {
- return 5;
- }
- @Override
- public boolean isViewFromObject(View view, Object object) {
- return view == object;
- }
- /*获得标题*/
- /*该方法必须写,不然tablayout不能显示标题*/
- @Override
- public CharSequence getPageTitle(int position) {
- return "TAB"+(position+1);
- }
- }
- }
效果:
滑动前
向下滑动后:
如果有viewpager嵌套fragment的场景,可以在fragment的根布局中加上NestedScrollView,这样就不会产生滑动冲突事件。如果使用的是ScrollView,会导致上下2个分离,CollapsingToolbarLayout未滑动时,scrollview也可以滑动(不支持嵌套滑动),这样就跟实际需求背离了。
NestedScrollView参考资料:
https://www.jianshu.com/p/f55abc60a879
add:
如何监听CollapsingToolbarLayout的展开与折叠?
这里我们使用官方提供的AppBarLayout.OnOffsetChangedListener就可以实现了,不过封装下效果更好。代码如下。
- import com.google.android.material.appbar.AppBarLayout
- abstract class AppBarStateChangeListener : AppBarLayout.OnOffsetChangedListener {
- private var mCurrentState = State.IDLE
- enum class State {
- EXPANDED,
- COLLAPSED,
- IDLE
- }
- override fun onOffsetChanged(appBarLayout: AppBarLayout?, i: Int) {
- appBarLayout?.let {
- if (i == 0) {
- if (mCurrentState != State.EXPANDED) {
- onStateChanged(it, State.EXPANDED)
- }
- mCurrentState = State.EXPANDED
- } else if (Math.abs(i) >= it.totalScrollRange) {
- if (mCurrentState != State.COLLAPSED) {
- onStateChanged(it, State.COLLAPSED)
- }
- mCurrentState = State.COLLAPSED
- } else {
- if (mCurrentState != State.IDLE) {
- onStateChanged(it, State.IDLE)
- }
- mCurrentState = State.IDLE
- }
- }
- }
- abstract fun onStateChanged(appBarLayout: AppBarLayout?, state: State)
- }
使用:
- appbar_layout.addOnOffsetChangedListener(object : AppBarStateChangeListener() {
- override fun onStateChanged(appBarLayout: AppBarLayout?, state: State) {
- if( state == State.EXPANDED ) {
- //展开状态
- }else if(state == State.COLLAPSED){
- //折叠状态
- }else{
- //中间状态
- }
- }
- })
FAQ:
1.CoordinatorLayout中的recyclerview下拉刷新卡顿,当从下往上快速滑动时,每次需要等待几秒才能刷新,怎么解决?
当recyclerview快速滑动时,不能触发下拉刷新,这是因为onSrollStateChanged()回调没有及时调用,当快速滑动时,会调用
- SCROLL_STATE_SETTLING(快速滑动)状态,该状态等到fling结束才会调用onSrollStateChanged()方法改变为SCROLL_STATE_IDLE(停止)状态(大概时间为2-3秒)。
- recycleviewCars.addOnScrollListener(new RecyclerView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
- super.onScrollStateChanged(recyclerView, newState);
- if(newState == RecyclerView.SCROLL_STATE_SETTLING){
- recycleviewCars.stopScroll();
- }
- }
- });
安卓Design包之CollapsingToolbarLayout(可折叠的工具栏布局)的简单使用的更多相关文章
- 安卓Design包之Toolbar控件的使用
转自:ToolBar的使用 ToolBar的出现是为了替换之前的ActionBar的各种不灵活使用方式,相反,ToolBar的使用变得非常灵活,因为它可以让我们自由往里面添加子控件.低版本要使用的话, ...
- 安卓Design包之TabLayout控件的使用
转自: 安卓Design包之TabLayout控件的简单使用 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android ...
- 安卓Design包之AppBar和Toolbar的联用
前面讲了Design包的的CoordinatorLayout和SnackBar的混用,现在继续理解Design包的AppBar; AppBarLayout跟它的名字一样,把容器类的组件全部作为AppB ...
- 安卓Design包下的TextInputLayout和FloatingActionButton的简单使用
终于介绍到Design包的最后的东西了. 也很简单,一个是TextInputLayout. TextInputLayout作为一个父容器,包含一个新的EditText,可以给EditText添加意想不 ...
- 安卓Design包之超强控件CoordinatorLayout与SnackBar的简单使用
在前面的Design中,学习使用了TabLayout,NavigationView与DrawerLayout实现的神奇效果,今天就带来本次Design包中我认为最有意义的控件CoordinatorLa ...
- 安卓Design包之TabLayout控件的简单使用
Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个supp ...
- 安卓Design包之CoordinatorLayout配合AppBarLayout,ToolBar,TabLaout的使用
转载: CoordinatorLayout配合AppBarLayout,Toolbar和TabLayout的使用 控件的简单介绍: AppBarLayout:它是继承LinerLayout实现的一个V ...
- 安卓Design包之NavigationView结合DrawerLayout,toolbar的使用,FloatingActionButton
注意:使用前需要添加Design依赖包,使用toolbar时需要隐藏标题头 FloatingActionButton 悬浮按钮:FloatingActionButton是重写ImageView的,所有 ...
- 带你实现开发者头条APP(四)---首页优化(加入design包)
title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...
随机推荐
- log4net配置的两种方式
----------文件配置:------------------- <?xml version="1.0" encoding="utf-8" ?> ...
- php资料站
Veda 原型:http://www.nowamagic.net/librarys/veda/cate/PHP
- Java工具类 Apache Commons:commons-lang
Commons Lang The standard Java libraries fail to provide enough methods for manipulation of its core ...
- 28.怎样在Swift中实现单例?
1.回忆一下OC中的单例实现 //AFNetworkReachabilityManager中的单例,省略了其他代码 @interface AFNetworkReachabilityManager : ...
- 关于新建JSP文件后,文件开头报错的处理
新建了一个web工程,之后建立了jsp页面,刚建立完成,文件开头就报错:The superclass "javax.servlet.http.HttpServlet" was no ...
- How a non-windowed component can receive messages from Windows -- AllocateHWnd
http://www.delphidabbler.com/articles?article=1 Why do it? Sometimes we need a non-windowed componen ...
- 用一个I/O口控制1个三色指示灯, 2个单色指示灯
http://www.baiheee.com/Documents/081207/081207184434.htm http://www.baiheee.com/Documents/081207/081 ...
- 提升jQuery开发技能的教程
iPhone-like Sliding Headers Simple jQuery Spy Effect Simple use of Event Delegation Adding Keyboard ...
- 10 个实用的 jQuery 表单操作代码片段
jQuery 绝对是一个伟大的开源JavaScript类库,是帮助我们快速和高效开发前端应用的利器.可能大家在日常的开发过程中常常会处理表单相关的 JavaScript,在今天这篇代码片段分享文章中, ...
- WP8异常错误:Error HRESULT E_FAIL has been returned from a call to a COM component.
在做WP8开发的过程中,使用到了longlistselector这个控件,本来使用没有问题. 但是突然出现了一个闪退的错误,错误信息如下: {MS.Internal.WrappedException: ...