Android学习笔记(八)--CoordinatorLayout的应用-仿支付宝界面
来源:互联网 发布:湖广填四川知乎 编辑:程序博客网 时间:2024/06/05 06:00
哈哈,差不多有一个礼拜没有更新,去广东那边旅游了四五天所以就没有更新,接下来就要恢复正常了,又要开始学习了。今天带来的是关于CoordinatorLayout的应用,模仿着支付宝做了一个界面,先看一下效果图吧。
实现了和支付宝一样的上滑收缩和变化的功能。核心使用的就是今天要说的coordinatorLayout。CoordinatorLayout作为“super-powered FrameLayout”基本实现两个功能:
1、作为顶层布局
2、调度协调子布局
就我的大白话来说就是协调子View之间动作的一个父View,通过Behavior来给子view实现交互的。
另外使用CoordinatorLayout需要在Gradle加入Support Design Library
compile 'com.android.support:design:24.2.1'
然后先看一下主布局。
<?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" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.sp.coordinatortry.MainActivity"> <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: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:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:contentInsetLeft="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>
shenghuo_head1和head2分别是如下
就不放具体代码了,可以自己自由的来实现,也不用非要拘泥于支付宝的样子。
然后是toolbar_head1和head2.分别是拖拉前后的样子。
然后content_scrolling就是一个简单的recyclerView,itemlayout则是一个CardView嵌套了一个TextView。
先放一下这个RecyclerView的Adapter。
package com.sp.coordinatortry;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by Jack on 2016/9/16. */public class ToolbarAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ private Context context; public ToolbarAdapter(Context context){ this.context=context; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(viewType==0){ return new ItemView(LayoutInflater.from(context).inflate(R.layout.shenghuo_head2,null)); }else{ return new ItemView(LayoutInflater.from(context).inflate(R.layout.layout_item,parent,false)); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } @Override public int getItemCount() { return 50; } @Override public int getItemViewType(int position) { if(position==0){ return 0; }else{ return 1; } } class ItemView extends RecyclerView.ViewHolder{ public ItemView(View itemView) { super(itemView); } }}
都很清晰简单,也不多说了。整个实现过程中最关键的就是在activity中的实现。先来介绍一下OnOffsetChangedListener。这个方法在AppBarLayout的布局偏移量发生改变时被调用。这个方法允许子view根据偏移量实现自定义的行为(比如在特定的时候更改View)。
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); } } } });
该activity中的应用如上。核心就设置AppBarLayout 的监听器addOnOffsetChangedListener来进行效果的处理。当verticalOffset=0的时候即使整个展开的是时候要做的就是显示要显示的,隐藏要隐藏的设置,在设置透明度,同理当verticalOffset等于appBarLayout.getTotalScrollRange()即等于最大值的时候,就是关闭的时候,处理的展开相反。当他在中间值的时候,通过`int alpha=255-Math.abs(verticalOffset);得到要设置的透明度。当alpha小于0的时候是执行展开的toolbar的透明度效果,反之大于0的时候是闭合时toolbar的透明图效果。
然后看一下完整的代码。
package com.sp.coordinatortry;import android.graphics.Color;import android.support.design.widget.AppBarLayout;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.ImageView;import android.widget.TextView;public class MainActivity extends AppCompatActivity { 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_main); 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); 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和CoordinatorLayout的应用还不是很深入,还要继续学习啊。
- Android学习笔记(八)--CoordinatorLayout的应用-仿支付宝界面
- Android开发学习笔记(八)Android应用界面编程 ImageView学习
- 高仿支付宝9.9.2版本生活模块界面来讲解CoordinatorLayout,AppBarLayout,CollapsingToolbarLayout
- 高仿支付宝9.9.2版本生活模块界面来讲解CoordinatorLayout,AppBarLayout,CollapsingToolbarLayout
- Android开发笔记(一百四十六)仿支付宝的支付密码输入框
- Android学习笔记-自定义仿支付宝ProgressBar动画
- Android学习笔记之 仿QQ登录界面的实现
- Android学习之RecylerView实习仿支付宝充值界面
- Android学习之RecylerView实习仿支付宝充值界面
- [学习笔记-Android]仿课程格子界面
- Android学习笔记(一)——仿qq聊天的welcome界面登陆的实现
- Android开发笔记(一百四十四)高仿支付宝的头部伸缩动画
- 第一章 仿支付宝芝麻信用界面制作(需要自定义View的相关知识)
- android 界面滑动隐藏(CoordinatorLayout+AppBarLayout)
- Android学习笔记(八) —— 手机页面的转换 — setContentView的应用
- 仿支付宝输入密码界面
- 学习Android CoordinatorLayout(一)
- 学习Android CoordinatorLayout(二)
- 第四次实验——直方图
- 文章标题
- c语言 预处理标识符的介绍及应用举例
- 实现简单交互式的android UI界面
- 嵌入式学习心得(二)
- Android学习笔记(八)--CoordinatorLayout的应用-仿支付宝界面
- 外观模式
- myeclipse 总是自动进入debug模式
- AIX PowerPC体系结构及其溢出技术学习笔记
- HDU 5242 利用树链剖分思想进行贪心
- alfalfa:长片段比对软件
- 程序员的自我修养 读书笔记 chp5,chp6
- 9. 大型网站架构模式
- 浏览器端JS导出EXCEL