高仿支付宝9.9.2版本生活模块界面来讲解CoordinatorLayout,AppBarLayout,CollapsingToolbarLayout

首先先看看仿制的效果先,如下图:


fangzhifubao.gif

是不是很像支付宝的效果呢,我们今天就要通过讲解android5.0新出的控件CoordinatorLayout,AppBarLayout,CollapsingToolbarLayout来实现这个效果。

在讲解之前先看看界面布局文件,在一个一个讲讲怎么实现吧:

<android.support.design.widget.CoordinatorLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:app="http://schemas.android.com/apk/res-auto" 
  xmlns:tools="http://schemas.android.com/tools" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:fitsSystemWindows="true" 
tools:context="com.example.jack.coordinatorlayouttest.ScrollingActivity"> 

<android.support.design.widget.AppBarLayout 
  android:id="@+id/app_bar"
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:fitsSystemWindows="true" 
  android:theme="@style/AppTheme.AppBarOverlay"> 

<android.support.design.widget.CollapsingToolbarLayout 
  android:id="@+id/toolbar_layout" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:fitsSystemWindows="true" 
  app:contentScrim="@color/color1984D1" 
  app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" app:title=" "> 

<include layout="@layout/shenghuo_head1" 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:layout_marginTop="100dp" 
  android:layout_marginBottom="25dp" 
  app:layout_collapseMode="parallax" 
  app:layout_collapseParallaxMultiplier="0.8"/> 

<android.support.v7.widget.Toolbar android:id="@+id/toolbar" 
  android:layout_width="match_parent" 
  android:layout_height="?attr/actionBarSize" 
  app:contentInsetLeft="0dp" app:contentInsetStart="0dp" 
  app:layout_collapseMode="pin">

 <include android:id="@+id/toolbar1" 
  layout="@layout/toolbar_head1" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" /> 

<include android:id="@+id/toolbar2" 
  layout="@layout/toolbar_head2" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" android:visibility="gone"/> 

</android.support.v7.widget.Toolbar> 
</android.support.design.widget.CollapsingToolbarLayout>  
</android.support.design.widget.AppBarLayout>  
<include 
layout="@layout/content_scrolling" />
</android.support.design.widget.CoordinatorLayout>

1.CoordinatorLayout

这就是整个高仿支付宝界面的核心布局界面的,看看代码量也不多吧,只要就是用了
CoordinatorLayout,AppBarLayout,CollapsingToolbarLayou,Toolbar这四个控件吧。
在各个布局文件里,最外围的是CoordinatorLayout这个控件,这个有什么作用呢,就我的大白话来说就是协调子View之间动作的一个父View,通过Behavior来给子view实现交互的。这样好像还是有点说不通,没关系同学们通过看上面的布局文件,可以发现

img1.PNG

这一个内容界面是的布局是<include layout="@layout/content_scrolling" />这一句的内容是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"  
   xmlns:app="http://schemas.android.com/apk/res-auto" 
   xmlns:tools="http://schemas.android.com/tools"  
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:orientation="vertical" 
   tools:showIn="@layout/activity_scrolling" 
   app:layout_behavior="@string/appbar_scrolling_view_behavior">
 <android.support.v7.widget.RecyclerView     
    android:id="@+id/myRecyclerView" 
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 </android.support.v7.widget.RecyclerView>
</LinearLayout>

没错就是一个linearLayout包裹着RecyclerView组成他的内容界面,在这代码里有这一句app:layout_behavior="@string/appbar_scrolling_view_behavior"就是这句和CoordinatorLayout控件互动实现滑动,总结就是CoordinatorLayout控件和app:layout_behavior来进行互动,进而CoordinatorLayout的子控件和app:layout_behavior互动。当然@string/appbar_scrolling_view_behavior是系统自带的,本质是一个类,我们也可以自定义这个类实现其他效果,不过这不是我们这一章所讲的了,我们点到即止。

2.AppBarLayout

其次就是AppBarLayout,去除官方解释,简单来说就是它可以让你定制当某个可滚动View的滚动手势发生变化时,其内部的子View实现何种动作。内部的子View通过在布局中加app:layout_scrollFlags设置执行的动作。而layout_srcollFlags的动作主要如下:

  1. scroll:值设为scroll的View会跟随滚动事件一起发生移动。
  2. enterAlways:值设为enterAlways的View,当ScrollView往下滚动时,该View会直接往下滚动。而不用考虑ScrollView是否在滚动。
  3. exitUntilCollapsed:值设为exitUntilCollapsed的View,当这个View要往上逐渐“消逝”时,会一直往上滑动,直到剩下的的高度达到它的最小高度后,再响应ScrollView的内部滑动事件。
  4. enterAlwaysCollapsed:是enterAlways的附加选项,一般跟enterAlways一起使用,它是指,View在往下“出现”的时候,首先是enterAlways效果,当View的高度达到最小高度时,View就暂时不去往下滚动,直到ScrollView滑动到顶部不再滑动时,View再继续往下滑动,直到滑到View的顶部结束。

这是layout_srcollFlags里可以设置的各个属性的解释,考虑文章的重点是模仿支付宝所以没有篇幅和每个属性都给个效果图,所以各属性你们有空还要自己试一试,这样子才能掌握更好。我们这里AppBarLayout关联的是CollapsingToolbarLayout,设置的属性是app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"里面的scroll让

img2.PNG

这可以滑动,而exitUntilCollapsed实现的效果是
img4.PNG
这一块当滑动到最顶的时候不会跟这个继续滑到最顶,而保留这一块。最后snap这是属性是子View不会存在局部显示的情况,滚动Child View的部分高度,当我们松开手指时,Child View要么向上全部滚出屏幕,要么向下全部滚进屏幕。

3.CollapsingToolbarLayout

是用来对Toolbar进行再次包装的ViewGroup,主要是用于实现折叠的App Bar效果。CollapsingToolbarLayout只要有这方面:
1.title展开时是最大的,然后随着收缩会越来越少,直到屏幕的顶部,通过app:title设置title,不然就默认。
2.通过setContentScrim(Drawable)来设置达到某一个状态之后的出现的效果3.通过setStatusBarScrim(Drawable)来设置达到某一个状态之后的状态栏出现的效果
4.当app:layout_collapseMode设为parallax子View可以选择在当前的布局当时是否以“视差”的方式来跟随滚动
5.当app:layout_collapseMode设为pinToolbar固定位置而不受移动的影响
在我们实现这里,我们把layout="@layout/shenghuo_head1"

img4.PNG

设为app:layout_collapseMode="parallax"让它以“视差”的方式来跟随滚动,而toolbar设为app:layout_collapseMode="pin"以让他固定不动。

4.Toolbar动态变化

在此整体布局就已经完成,不过还有一个效果就是向上移动是toolbar的的View是动态变化的,一开始我以为这些控件会有这个功能吧,没想到找了很久都没找到,没办法只能自己实现了。二话不说上代码:

private AppBarLayout mAppBarLayout=null;
 private View mToolbar1=null; 
private View mToolbar2=null; 
private ImageView mZhangdan=null;
private TextView mZhangdan_txt=null; 
private ImageView mTongxunlu=null; 
private ImageView mJiahao=null; 
private ImageView mZhangdan2=null; 
private ImageView mShaoyishao=null; 
private ImageView mSearch=null; 
private ImageView mZhaoxiang=null; 
private RecyclerView myRecyclerView; 

@Override protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); setContentView(R.layout.activity_scrolling);

myRecyclerView=(RecyclerView)findViewById(R.id.myRecyclerView);
myRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
myRecyclerView.setAdapter(new ToolbarAdapter(this)); 
mAppBarLayout=(AppBarLayout)findViewById(R.id.app_bar); 

mToolbar1=(View)findViewById(R.id.toolbar1); 
mToolbar2=(View)findViewById(R.id.toolbar2);

mZhangdan=(ImageView)findViewById(R.id.img_zhangdan); 
mZhangdan_txt=(TextView)findViewById(R.id.img_zhangdan_txt); 
mTongxunlu=(ImageView)findViewById(R.id.tongxunlu);
mJiahao=(ImageView)findViewById(R.id.jiahao); 

mZhangdan2=(ImageView)findViewById(R.id.img_shaomiao); 
mShaoyishao=(ImageView)findViewById(R.id.img_fukuang); 
mSearch=(ImageView)findViewById(R.id.img_search); 
mZhaoxiang=(ImageView)findViewById(R.id.img_zhaoxiang); 

mAppBarLayout.addOnOffsetChangedListener(
new AppBarLayout.OnOffsetChangedListener() {
 @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
if (verticalOffset == 0){
 //张开
mToolbar1.setVisibility(View.VISIBLE);
mToolbar2.setVisibility(View.GONE); 
setToolbar1Alpha(255); 
} else if (Math.abs(verticalOffset)>=appBarLayout.getTotalScrollRange()) {
 //收缩 
mToolbar1.setVisibility(View.GONE); 
mToolbar2.setVisibility(View.VISIBLE); 
setToolbar2Alpha(255); 
} else {
 int alpha=255-Math.abs(verticalOffset)-150; 
if(alpha<=0){ 
//收缩
toolbar mToolbar1.setVisibility(View.GONE); 
mToolbar2.setVisibility(View.VISIBLE); 
setToolbar2Alpha(Math.abs(verticalOffset)); 
}else{ 
//张开
toolbar mToolbar1.setVisibility(View.VISIBLE); 
mToolbar2.setVisibility(View.GONE); setToolbar1Alpha(alpha); 
  }
 }
 }
 });
 }
 //设置展开时各控件的透明度 
public void setToolbar1Alpha(int alpha){
  mZhangdan.getDrawable().setAlpha(alpha); 
  mZhangdan_txt.setTextColor(Color.argb(alpha,255,255,255)); 
  mTongxunlu.getDrawable().setAlpha(alpha); 
  mJiahao.getDrawable().setAlpha(alpha); 
} 
//设置闭合时各控件的透明度 
public void setToolbar2Alpha(int alpha){
  mZhangdan2.getDrawable().setAlpha(alpha); 
  mShaoyishao.getDrawable().setAlpha(alpha);
  mSearch.getDrawable().setAlpha(alpha);     
  mZhaoxiang.getDrawable().setAlpha(alpha); 
}

代码还是有点多了不过最核心就设置AppBarLayout 的监听器addOnOffsetChangedListener来进行效果的处理。当verticalOffset=0的时候即使整个展开的是时候要做的就是显示要显示的,隐藏要隐藏的设置,在设置透明度,同理当verticalOffset等于appBarLayout.getTotalScrollRange()即等于最大值的时候,就是关闭的时候,处理的展开相反。当他在中间值的时候,通过`int alpha=255-Math.abs(verticalOffset)-150;得到要设置的透明度,减去150是为了让效果更明显。当alpha小于0的时候是执行展开的toolbar的透明度效果,反之大于0的时候是闭合时toolbar的透明图效果。

剩下的看源码
如果对你有帮助就请给我给星星或喜欢吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容