参考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)

@Overridepublic void afterBindView() {shanghaiAppBarlayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {@Overridepublic 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.AppBarLayoutandroid:id="@+id/shanghai_app_barlayout"android:layout_width="match_parent"android:layout_height="wrap_content"><!--CollapsingToolbarLayout可以折叠的布局app:layout_scrollFlags="scroll" 如果不滑动会一直停在屏幕中间--><android.support.design.widget.CollapsingToolbarLayoutapp: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"><ImageViewapp: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.Toolbarapp:layout_collapseMode="pin"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"><TextViewandroid: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><TextViewandroid: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.NestedScrollViewapp:layout_behavior="@string/appbar_scrolling_view_behavior"android:background="@color/color_gray"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:textColor="@color/color_ffffff"android:gravity="center"android:text="@string/str_main_shanghai"android:layout_width="match_parent"android:layout_height="50dp" />...<TextViewandroid:textColor="@color/color_ffffff"android:gravity="center"android:text="@string/str_main_shanghai"android:layout_width="match_parent"android:layout_height="50dp" /><TextViewandroid:textColor="@color/color_ffffff"android:gravity="center"android:text="@string/str_main_shanghai"android:layout_width="match_parent"android:layout_height="50dp" />...<TextViewandroid: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,则root 会把 子view添加进来。
  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两个参数

Android-布局 协调CoorinatorLayout相关推荐

  1. android 布局之RelativeLayout(相对布局)

    android 布局分为LinearLayout TableLayout RelativeLayout FreamLayout AbsoluteLayout. 常用的有LinearLayout,Tab ...

  2. android 布局 站位符,基于android布局中的常用占位符介绍

    大家在做布局文件是肯定会遇到过下面的这种情况 填充出现问题,所以需要用到占位符规范填充 汉字常用占位符: android:layout_width="wrap_content" a ...

  3. 在android布局中使用include和merge标签

    在我们开发Android布局时,经常会有很多的布局是相同的,这个时候我们可以通过<include/>和<merge/>标签实现将复杂的布局包含在需要的布局中,减少重复代码的编写 ...

  4. Xamarin Android布局文件没有智能提示

    Xamarin Android布局文件没有智能提示 在Visual Studio 2015中,Android项目的Main.axml文件没有智能提示,不便于布局文件的编写.解决办法: (1)从Xama ...

  5. android表格布局最后一个组件,Android布局之TableLayout表格布局

    Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件.当为TableRow对象时,可在TableRow下添加子控件,默认情况下,每个子控件占据一列 ...

  6. 下列不属于android布局的是( ),Android软件工程师笔试题(全选择题)【0-1年经验】...

    Android软件工程师笔试题,全选择题,适合0-1年经验的面试者. Android软件工程师笔试题 单选题(共35题) 1.退出 activity 对一些资源以及状态的操作保存,可以在生命周期的哪个 ...

  7. 【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )

    文章目录 总结 一.Android 布局依赖注入步骤 二.Android 布局依赖注入示例 1.创建依赖注入库 2.声明注解 3.Activity 基类 4.依赖注入工具类 5.客户端 Activit ...

  8. android 布局权重问题(最近布局经常坑爹)

    android 布局 权重 With layout_weight you can specify a size ratio between multiple views. E.g. you have ...

  9. Android布局文件的布局方式

    Android布局文件的属性值解析说明:   1.android:id [为控件指定相应的ID] 2.android:text [指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xm ...

  10. android布局的作用,Android UI布局经验总结

    如何在Android中动态设置颜色透明?10%20%到100% Android布局分析工具HierarchyView Android使用include/merge/ViewStub优化布局 List的 ...

最新文章

  1. avue 文字点击 弹窗_经验 | UI设计师必懂的App弹窗设计方法
  2. 带有托管代码的InfoPath2007表单模版发布到SharePoint表单库(浏览器方式查看)
  3. Qt文档阅读笔记-Qt Core的官方解析
  4. 在搜索框自动输入文本_selenium自动化测试之常见的定位元素
  5. 全栈路线_程序员该走全栈路线还是深度专家路线?
  6. 基于ASP的校园二手交易网设计与实现程序免费下载
  7. 使用命令强制关闭端口进程
  8. python读文件的方法open,file,with open
  9. 连上wifi浏览器不能上网微信却可以登陆
  10. uva 10158 - War(并查集)
  11. 从MWC 2016看手机发展
  12. sql根据出生日期算年龄
  13. HHTC第十二届程序设计竞赛
  14. linux中分隔符IFS
  15. M 个同样的苹果放在N 个同样的盘子里,允许有的盘子空着不放的算法
  16. NLP专题直播 | 详谈词向量技术:从Word2Vec, BERT到XLNet
  17. Minecraft——Forge1.16.5模组开发(36.2.20)——(3)第一个实体方块
  18. 如何快捷得去除代码中的行号?
  19. wince5.0模拟器连接ActiveSync和共享网络PC分享上网及运行BS程序(模拟手持设备)
  20. 移动硬盘无法读取怎么修复?

热门文章

  1. 超市会员积分管理系统
  2. 质量回顾分析系统软件(QRS)
  3. 大数据小项目之电视收视率企业项目03
  4. Revo Uninstaller专业版
  5. new Foo 和 new Foo()的区别以及Foo f2()的问题
  6. Oracle Spatial 空间分析之缓冲区分析
  7. 【亲测】80个经典在线休闲H5小游戏源码合集,直接上传空间即可使用,可玩性还不错
  8. MySql数据的完整性
  9. 麦克风阵列波束形成之DSB原理与实现
  10. CyclicBarrier(集成7颗龙珠召唤神龙)