今天在项目中,遇见实现类似360软件详情页的效果,结合现在比较流行的Material design,采用了CoordinatorLayout来实现这个效果,跟大家分享一下。

首先,看一下需求的效果,由于不会搞gif图,所以图是从翔哥那抠出来的,效果是一样的。

中部导航栏在滑上去后会顶在窗口顶部,隐藏顶部部分,下拉的时候又将顶部显示出来,这样的效果,现在也比较常见了,现在带大家了解一下我的实现方式

首先,必须添加design依赖

  //noinspection GradleCompatiblecompile 'com.android.support:design:24.0.0-alpha1'

然后就是如何布局了

<?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:context="test1.up72.com.myapplication.MainActivity"><android.support.design.widget.CoordinatorLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><android.support.design.widget.AppBarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/white"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="208dp"android:background="@color/grey_200"app:layout_scrollFlags="scroll|enterAlways|snap"><Viewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/ic_bg_daobo" /></FrameLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/grey_300" /><android.support.design.widget.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabGravity="fill"app:tabIndicatorColor="@color/colorPrimary"app:tabSelectedTextColor="@color/colorPrimary"app:tabTextColor="@color/grey_900" /></android.support.design.widget.AppBarLayout><android.support.v4.view.ViewPagerandroid:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior" /></android.support.design.widget.CoordinatorLayout>
</LinearLayout>

这里讲解一下,整个布局其实都是被CoordinatorLayout包裹。

CoordinatorLayout的作用
一:作为顶层布局。
二:协调子布局。

AppBarLayout 是继承LinerLayout实现的一个ViewGroup容器组件,它是为了Material Design设计的App Bar,

支持手势滑动操作。

默认的AppBarLayout是垂直方向的,它的作用是把AppBarLayout包裹的内容都作为AppBar。

AppBarLayout是支持手势滑动效果的,不过的跟CoordinatorLayout配合使用

以上是大神讲解的,比我说的清楚。简而言之

CoordinatorLayout与AppBarLayout结合使用来实现手势的滑动效果。

要实现滑动效果,有三个必须实现条件。

1.必须设置CoordinatorLayout作为顶层布局

2.必须将滑动隐藏布局设置 app:layout_scrollFlags=”scroll|enterAlways”属性,”scroll|exitUntilCollapsed”也可以,只不过实现效果不一样。

3.将滑动的view设置app:layout_behavior=”@string/appbar_scrolling_view_behavior”属性

上面可以看出Flamelayout实现条件2,viewPager实现条件3

scroll: 所有想滚动出屏幕的view都需要设置这个flag,没有设置这个flag的view将被固定在屏幕顶部。例如,TabLayout 没有设置这个值,将会停留在屏幕顶部。

enterAlways:设置这个flag时,向下的滚动都会导致该view变为可见,启用快速“返回模式”。

enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。

package test1.up72.com.myapplication;import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {private TabLayout tabLayout;private FragmentAdapter adapter;private ViewPager viewPager;private String title[];@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = (ViewPager) findViewById(R.id.viewPager);tabLayout = (TabLayout) findViewById(R.id.tabLayout);title = this.getResources().getStringArray(R.array.star_user_info);viewPager.setAdapter(adapter = new FragmentAdapter(getSupportFragmentManager(), this, getFragments(), title));tabLayout.setupWithViewPager(viewPager);tabLayout.setTabMode(TabLayout.MODE_FIXED);}private ArrayList<Fragment> getFragments() {ArrayList<Fragment> fragments = new ArrayList<>();fragments.add(new Fragment1());fragments.add(new Fragment2());fragments.add(new Fragment3());return fragments;}
}

这里就很简单啦,Tablayout,ViewPager,三个Fragment,然后在里面实现RecylerView效果

Fragmen实现列表效果,填充数据

package test1.up72.com.myapplication;import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import java.util.ArrayList;/*** Created by wangchang on 2016/3/31.*/
public class Fragment1 extends Fragment {private RecyclerView recyclerView;private NewAdapter adapter;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_eye, container, false);}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);recyclerView = (RecyclerView) getActivity().findViewById(R.id.recylerview);recyclerView.setHasFixedSize(true);recyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));recyclerView.setAdapter(adapter = new NewAdapter());adapter.replaceAll(getData());}public ArrayList<NewsModel> getData() {ArrayList<NewsModel> list = new ArrayList<>();for (int i = 0; i < 20; i++) {NewsModel model = new NewsModel();model.setItem("简介" + i);list.add(model);}return list;}
}

适配器的实现

package test1.up72.com.myapplication;import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import java.util.ArrayList;/*** Created by wangchang on 2016/3/29.*/
public class NewAdapter extends RecyclerView.Adapter<NewAdapter.BaseViewHolder> {private ArrayList<NewsModel> dataList = new ArrayList<>();public void replaceAll(ArrayList<NewsModel> list) {dataList.clear();if (list != null) {dataList.addAll(list);}notifyDataSetChanged();}@Overridepublic NewAdapter.BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new NewViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_new_list, parent, false));}@Overridepublic void onBindViewHolder(NewAdapter.BaseViewHolder holder, int position) {holder.setData(dataList.get(position));}@Overridepublic int getItemCount() {return dataList != null ? dataList.size() : 0;}public class BaseViewHolder extends RecyclerView.ViewHolder {public BaseViewHolder(View itemView) {super(itemView);}void setData(Object data) {}}private class NewViewHolder extends BaseViewHolder {private TextView tv;public NewViewHolder(View view) {super(view);tv = (TextView) view.findViewById(R.id.tv);}@Overridevoid setData(Object data) {if (data != null) {NewsModel model = (NewsModel) data;tv.setText(model.getItem());}}}
}

这样就是先啦,先看看我实现的效果图吧


这里设置exitUntilCollapsed,enterAlways会实现两种不同的滑动效果,exitUntilCollapsed会实现当滑动列表滑到顶端才会实现隐藏效果,enterAlways会实现只有上滑就会隐藏顶部的效果。

附上代码下载地址

http://pan.baidu.com/s/1bpr0xBp

就到这里啦,下班。

Android学习之CoordinatorLayout轻松实现360软件详情页相关推荐

  1. Android 自定义控件 轻松实现360软件详情页

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载请标 ...

  2. JavaWeb学习-案例练习-图书管理前台-10- 图书详情页的实现

    前面一篇实现了前端图书列表的分页操作,可以点击上一页和下一页,这个我们实现每个页面显示4本书,实际开发中,一般设置20条记录或者40条记录,这个实现原理是一样的.这篇来学习,在前端页面点击这本书的名称 ...

  3. Android自定义ScrollView实现仿拉手团购详情页标题

    我们在做商品详情页的时候,一般是有一个商品的标题的,那么商品详情一般都是比较长的,然后手机屏幕又比较小,这样往下拉的时候就看不到商品标题以及退出,分享,收藏按钮了,这样用户体验是不好的.相信大家都用过 ...

  4. android学习笔记---53_采用网页设计软件界面,以及使用android系统内置的浏览器,利用js调用java方法

    Java技术qq交流群:JavaDream:251572072 2013/5/16 53_采用网页设计软件界面 ------------------------------ 1.注意这里可以把网页放到 ...

  5. 小程序 pagescrollto_微信小程序学习笔记(三)-- 首页及详情页开发

    一.常用组件 在上一个章节中讲解了封装请求数据的模块,在此处请求轮播图的数据 1.首页轮播图数据的请求以及渲染 1.1 轮播图数据的请求 pages/home/home.js import 2 使用组 ...

  6. android仿制应用宝的应用详情页

    最近看到了应用宝的软件详情页,感觉不明觉厉的样子, 于是粗略的仿制了一下,发现做的还算是可以出来见人吧 实现方法很简单,就是通过重写ScrollView的分发事件,详情请看代码. public cla ...

  7. Android自定义View实现自动无限轮播,点击图片进入详情页

    图片接口 http://120.27.23.105/ad/getAd 需要导入Glide设置图片的依赖 compile 'com.github.bumptech.glide:glide:3.7.0' ...

  8. 360软件管家android,360软件管家

    <360软件管家>,一款手机必备的软件管理平台.你可以通过这款软件来下载各种安全无毒的游戏.软件,还可以卸载掉各种顽固的插件和软件,让你的手机不再卡顿.快来下载体验一下吧. 软件详情 36 ...

  9. 初学者---Android 学习资料

    转自: 1.hanhailong/AndroidStudyResources https://github.com/hanhailong/AndroidStudyResources 2.Android ...

  10. Android 学习论坛博客及网站推荐 1

    Android 学习论坛博客及网站推荐 一.博客推荐 1)http://blog.csdn.net/android_tutor (Android开发入门基础,高级进阶) 2)http://blog.c ...

最新文章

  1. 树形数据深度排序处理示例(递归法).sql
  2. 浅谈HASH算法与CSDN密码泄漏事件
  3. optee中TA的堆的分配
  4. 大洋洲群狼来了! 这是中国篮球学习契机?
  5. antd tree搜索并定位_KD-Tree原理详解
  6. 一个程序如何连接到外网_如何从头开始开发一个微信小程序
  7. 剑指offer——面试题55:字符流中第一个不重复的字符
  8. python库批量安装的方法
  9. 01-bilibilidemo配置
  10. 平面设计从事什么工作
  11. 使用webgl(three.js)搭建一个3D智慧园区、3D建筑,3D消防模拟,web版3D,bim管理系统——第四课(炫酷版一)
  12. 【原创】我所认识的银行业务之旅(票据篇)
  13. Tensorflow2.0---SSD网络原理及代码解析(一)
  14. S7-200SMART案例分析——伺服接线
  15. 生信个人笔记之TCGA
  16. Python爬虫实例:爬取“查IPIP”查询结果,查询IP地址归属地
  17. 遗传算法最通俗的讲解案例
  18. Microsoft Office Home and Student 2007 密匙
  19. 豆瓣民谣排行100爬取练习
  20. 上新|设计开发在线协同工具墨刀「设计画布」全新发布

热门文章

  1. Sue的小球 [费用提前计算]
  2. 通往财富自由之路20160808--付费就是捡便宜
  3. 2021年茶艺师(中级)考试技巧及茶艺师(中级)作业考试题库
  4. mybatis自定义枚举类型的转换器以及各种使用场景
  5. 什么是服务器?服务器是用来做什么的?
  6. 女儿拿着小天才电话手表问我App启动流程
  7. 海马玩模拟器——搭建React Native环境
  8. BZOJ1864: [Zjoi2006]三色二叉树
  9. 25 个你可能不知道的 Linux 真相
  10. strtok()函数详解!