Android-布局 协调CoorinatorLayout

参考Android连载课程

协调交互原理讲解

CoordinatorLayout 是一个整体的ViewGroup,它的主要作用是协调各个子View之间的滑动交互,也就是Behavior,后期我们会详细讲一下怎么来自定义Behavior。

来源于design包下的控件

Design控件、RadioGroup

  1. 什么是Design

全称是Android Material Design,是一套全新的控件库,里面包含AppBarLayout、CollapsingToolbarLayout、CoordinatorLayout(都是design包下的控件),FloatingActionButton、NavigationView、Snackbar、TabLayout、TextInputLayout这八种控件。

2、RadioGroup 和 RadioButton常常组合起来使用,RadioButton是一种点选操作按钮,开发有时也会用TextView做替代,只是RadioButton更方便一些。

 

AppBarLayout:首先,AppBarLayout是一个LinearLayout,它的子View默认纵向排列, 可以通过一些参数控制子View的滑动行为

AppBarLayout:对下面的子控件提供一些layout_scrollFlags属性的配置

layout_scrollFlags配置详细说明:

全局滑动事件处理

Scroll:跟着滑动的方向进行滑动,如果不配置会一直在屏幕中静态显示(也就是滑不动)

Snap:这个属性有个很明显回弹效果,当滑动距离过短时,会回弹到最近的上边缘或者下边缘。

app:layout_scrollFlags="scroll|snap"

向下滑动事件处理

EnterAlways:这个属性其实就是向下滚动时Scrolling View(指NestedScrollView)和Child View(指AppBarLayout包裹的内容)之间的滚动优先级问题,当向下滚动时,优先滑出Child View,当全部滑出时,再去处理Scrolling View的滑动事件。

app:layout_scrollFlags="scroll|snap|enterAlways"

运行效果:先处理父布局滑动

 

EnterAlwaysCollapsed:这个属性是上个属性的附加值,这里涉及到Child View的高度和最小高度,向下滚动时,Child View先向下滚动最小高度值,然后Scrolling View开始滚动,到达边界时,Child View再向下滚动,直至显示完全。

向上滑动事件处理

ExitUntilCollapsed:这里也涉及到最小高度。发生向上滚动事件时,Child View向上滚动退出直至最小高度,然后Scrolling View开始滚动。也就是,Child View不会完全退出屏幕。

CollapsingToolbarLayout:实现Toolbar的折叠效果,所以去掉enterAlwaysCollapsed,防止toolBar总是在屏幕最上方。

contentScrim:折叠后的颜色

运行效果:

 

任何一个滑动的控件都是有监听的 

layout_collapseMode:pin 滑动时会固定到屏幕上,不会折叠,parallax会发生折叠,并带有一定的视差特效效果,视差特效的比例由layout_collapseParallaxMultiplier来控制。

运行效果:图片折叠不那么死板了

这样就出现视频填充错误: ScrollView只能容纳一个直接child,所以只能把view控件放在LinearLayout布局下

Behavior: 处理交互的,其中最主要有两个知识点,依赖方和被依赖方。

目前用的系统的这个Behavior 被依赖的是 AppBarLayout,依赖的就是我们下面的整个布局。

NestedScrollView覆盖了AppBarLayout,导致图片无法显示,加入下面语句

可以垂直滚动的{@link View}s 应该使用的行为,并支持嵌套滚动,以自动滚动任何{@link AppBarLayout}sibings兄弟。

测试:往下滑动,打印的日志verticalOffset都是负的(<=0)

 

@Override
    public void afterBindView() {
        shanghaiAppBarlayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                Log.e("shanghaiAppBarlayout", "verticalOffset=" + verticalOffset + "appBarLayout=" + appBarLayout.getMeasuredHeight());
                if (-verticalOffset < appBarLayout.getMeasuredHeight() / 2) {
                    //说明它在布局的上半部分
                    tvShanghaiWelcome.setVisibility(View.INVISIBLE);
                } else {
                    tvShanghaiWelcome.setVisibility(View.VISIBLE);
                }
            }
        });
    }

当加了一下这行

模仿微博热搜

布局源码

<?xml version="1.0" encoding="utf-8"?>
<!--最外层必须是CoordinatorLayout,可以处理一些滑动事件-->
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        <!--CollapsingToolbarLayout可以折叠的布局
        app:layout_scrollFlags="scroll" 如果不滑动会一直停在屏幕中间
        -->
        <android.support.design.widget.CollapsingToolbarLayout
            app:contentScrim="@color/colorPrimaryDark"
            app:layout_scrollFlags="scroll|snap|enterAlways|exitUntilCollapsed"
            android:id="@+id/shanghai_collapsingToolbarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.6"
                android:scaleType="centerCrop"
                android:src="@mipmap/shanghai"
                android:layout_width="match_parent"
                android:layout_height="200dp" />
            <!--app:layout_collapseMode="pin" 可以停留在屏幕上面的,不会折叠-->
            <android.support.v7.widget.Toolbar
                app:layout_collapseMode="pin"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize">
                <TextView
                    android:id="@+id/tv_shanghai_welcome"
                    android:textColor="@color/color_black_30"
                    android:gravity="center"
                    android:visibility="gone"
                    android:text="上海欢迎您"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />
            </android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>
        <TextView
            android:textColor="@color/color_black_30"
            android:gravity="center"
            android:text="我能停留,可用于水平滑动"
            android:layout_width="match_parent"
            android:layout_height="50dp" />
    </android.support.design.widget.AppBarLayout>
    <!--嵌套滚动使用-->
    <android.support.v4.widget.NestedScrollView
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:background="@color/color_gray"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:textColor="@color/color_ffffff"
                android:gravity="center"
                android:text="@string/str_main_shanghai"
                android:layout_width="match_parent"
                android:layout_height="50dp" />
        ...
            <TextView
                android:textColor="@color/color_ffffff"
                android:gravity="center"
                android:text="@string/str_main_shanghai"
                android:layout_width="match_parent"
                android:layout_height="50dp" />
            <TextView
                android:textColor="@color/color_ffffff"
                android:gravity="center"
                android:text="@string/str_main_shanghai"
                android:layout_width="match_parent"
                android:layout_height="50dp" />
        ...
            <TextView
                android:textColor="@color/color_ffffff"
                android:gravity="center"
                android:text="@string/str_main_shanghai"
                android:layout_width="match_parent"
                android:layout_height="50dp" />
               
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
app:layout_behavior="@string/appbar_scrolling_view_behavior"
<!--在背景图片的下面-->

 

TabLayout+ViewPager+Fragment

ViewPager中的Adapter:(https://blog.csdn.net/rankun1/article/details/51842471)

主要涉及这几个类,PagerAdapter、FragmentStatePagerAdapter、FragmentPagerAdapter。  

PagerAdapter:原始基类。

FragmentPagerAdapter:继承PagerAdapter,适用页数小的静态页面,所有Fragment会保存到内存当中,Fragment切换时只会走到 onDestoryView这个生命周期。

FragmentStatePagerAdapter:继承PagerAdapter,适用页数多的动态页面,Fragment切换时会走到onDetach这个生命周期。

Recyclerview 

几个重要的角色

1、Recycler

管理那些已经废弃了的或者从RecyclerView中分离的item view用于复用,主要用于存的设计 

一共四层缓

    * 1.一级缓存:mAttachedScrap
    * 2.二级缓存:mCacheViews
    * 3.三级缓存:mViewCacheExtension
    * 4.四级缓存:mRecyclerPool

 提取大段代码到方法 Ctrl + Alt + M(Windows/Linux上) 参考 https://www.jianshu.com/p/d3fb77a2ea68

 

2LayoutManager

LayoutManager是一个抽象类(可自定义),有3个子类:

  1. LinearLayoutManager 线性布局管理器
  2. GridLayoutManager 表格布局管理器
  3. StaggeredGridLayoutManager 瀑布流布局管理器

参考 https://www.jianshu.com/p/2f415100755c

ViewHolder主要用来缓存view的(每个条目创建时,都是通过RecyclerView.ViewHolder来做的)

3、Adapter

适配器设计模式,把相应数据Data展示到不同的 布局View 中。

4、高级用法

复杂条目、设置监听时机、缓存池的应用。

RecyclerView inflate布局时  传入的三个参数具体有什么关系?涉及系统源码

  1. root 不为null  attachToRoot 为false子View会设置 root LayoutParams。
  2. root 不为null  attachToRoot 为 ture,rootview添加进来。
  3. root  null  RecycleView 会默认给子View生成一个默认的LayoutParams,所以会导致条目展示问题。

tryGetViewHolderForPositionByDeadline

Adapter简易封装及原理

  1. 使用的是RecyclerView中的Adapter
  2. 自定义ViewHolder
  3. SparseArray原理
  4. CharSequence与String的关系 富文本

ShangHarAdapter

View来自的BaseFragment返回的填充

 

设置参数提示

通过这里拿到

从外部传入

代码编写顺序:

  1. ShanghaiViewHolder extends RecyclerView.ViewHolder
  2. onBindViewHolder
  3. RecyclerView.ViewHolder onCreateViewHolder

没有填充板

如果填充布局是LinearLayout时,记得配置parent和false两个参数

 


版权声明:本文为qq_37802398原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。