Android实现酷炫的顶部栏

AppBarLayout 是继承LinerLayout实现的一个ViewGroup容器组件,它是为了Material Design设计的App Bar,支持手势滑动操作的,不过经常与Toolbar、CoordinatorLayout以及CollapsingToolbarLayout等一起配合使用,在说到AppBarLayout之前,我们先简单学习一下Toolbar。和往常一样,主要还是想总结一下我在学习过程中的一些笔记以及一些需要注意的地方。

一、Toolbar

Toolbar是在 Android 5.0 开始推出的一个 Material Design 风格的导航控件 ,Google 非常推荐大家使用 Toolbar 来作为Android客户端的导航栏,以此来取代之前的 Actionbar,也就是说,ActionBar能做的,Toolbar都能做 。与 Actionbar 相比, Toolbar 要灵活的多。它不像 Actionbar 一样,一定要固定在Activity的顶部,而是可以放到界面的任意位置。除此之外,在设计 Toolbar 的时候,Google也留给我们很多可以修改的余地

•设置导航栏图标
 •设置App的logo
 •设置标题和子标题
 •添加一个或多个的自定义控件
 •设置Action Menu

为了容易理解,我们先看看效果图:

按照效果图,从左到右分别是导航栏图标 、App的logo 、 标题和子标题 、 自定义控件(一个TextView和ImageView) 以及 ActionMenu

1、用Toolbar的时候,首先要隐藏原本的ActionBar
(1)通过在我们的styles.xml文件中的AppTheme标签中设置以下属性:

<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>

(2)通过修改我们继承的主题为:Theme.AppCompat.Light.NoActionBar

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="colorPrimary">@color/blue</item>
  <item name="colorPrimaryDark">@color/blue_dark</item>
  <item name="colorAccent">@color/red</item>
  <item name="textAllCaps">false</item>
 </style>

(3)在Activity中调用下面这句,去掉了默认的导航栏

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

2、在布局文件中添加我们需要的Toolbar控件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">

 <android.support.v7.widget.Toolbar
  android:id="@+id/toolbar"
  android:layout_width="match_parent"
  android:layout_height="?android:actionBarSize"
  android:background="?attr/colorPrimary">
  <!--自定义控件-->
  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="点击" />

  <ImageView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginLeft="2dp"
   android:src="@mipmap/icon" />
 </android.support.v7.widget.Toolbar>
</LinearLayout>

3、接着在 menu_main.xml 中添加 action menu 菜单项

<menu xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto">
 <item
  android:id="@+id/add"
  android:icon="@mipmap/icon_add"
  app:showAsAction="always" />
 <item
  android:id="@+id/add_friend"
  android:title="添加朋友"
  app:showAsAction="never" />
 <item
  android:id="@+id/scace"
  android:title="扫一扫"
  app:showAsAction="never" />
</menu>

4、在Activity 中初始化Toolbar 控件,并设置相对应的属性

package per.lijuan.appbarlayoutdome;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.Toast;

/**
 * Created by lijuan on 2016/8/31.
 */
public class Activity extends AppCompatActivity {
 private Toolbar toolbar;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_second);
  toolbar = (Toolbar) findViewById(R.id.toolbar);

  /**
   * 设置标题
   */
  toolbar.setTitle("标题");
  /**
   * 设置子标题
   */
  toolbar.setSubtitle("子标题");
  /**
   * 设置App的logo
   */
  toolbar.setLogo(R.mipmap.ic_launcher);
  /**
   * 设置导航按钮
   */
  toolbar.setNavigationIcon(R.mipmap.back);
  setSupportActionBar(toolbar);
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.menu_main, menu);
  return true;
 }

 /**
  * 设定菜单各按鈕的动作
  *
  * @return
  */
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
   case android.R.id.home:
    finish();
    break;
   case R.id.add:
    Toast.makeText(SecondActivity.this, "添加", Toast.LENGTH_SHORT).show();
    break;
   case R.id.add_friend:
    Toast.makeText(SecondActivity.this, "添加朋友", Toast.LENGTH_SHORT).show();
    break;
   case R.id.scace:
    Toast.makeText(SecondActivity.this, "扫一扫", Toast.LENGTH_SHORT).show();
    break;
   default:
    break;
  }
  return super.onOptionsItemSelected(item);
 }
}

二、CollapsingToolbarLayout

CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout_scrollFlags,它可以控制包含在CollapsingToolbarLayout中的控件(如:ImageView、Toolbar)在响应layout_behavior事件时作出相应的scrollFlags滚动事件(移除屏幕或固定在屏幕顶端)

三、AppBarLayout

我们来看看最终的效果图:

从效果图来看,当设置了layout_behavior的控件响应起了CollapsingToolbarLayout中的layout_scrollFlags事件时,ImageView会有视差效果的向上滚动移除屏幕,当开始折叠时,CollapsingToolbarLayout的背景色(也就是Toolbar的背景色)就会变为我们设置好的背景色,Toolbar也一直会固定在最顶端

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent">

 <android.support.design.widget.AppBarLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

  <android.support.design.widget.CollapsingToolbarLayout
   android:id="@+id/collapsing_toolbar_layout"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   app:contentScrim="#3F51B5"
   app:layout_scrollFlags="scroll|exitUntilCollapsed">

   <ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:src="@mipmap/icon_bg"
    app:layout_collapseMode="parallax"
    app:layout_collapseParallaxMultiplier="0.5" />

   <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    app:layout_collapseMode="pin"
    app:title="@string/app_name"
    app:titleTextColor="#FFFFFF" />

  </android.support.design.widget.CollapsingToolbarLayout>

 </android.support.design.widget.AppBarLayout>

 <android.support.v7.widget.RecyclerView
  android:id="@+id/recyclerview"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.CoordinatorLayout>

(1)我们在CollapsingToolbarLayout中设置了一个ImageView和一个Toolbar,并将这个CollapsingToolbarLayout作为一个整体放在AppBarLayout中

(2)在CollapsingToolbarLayout中,我们设置了app:layout_scrollFlags="scroll|enterAlwaysCollapsed",它的值还包括:
 •scroll - 想滚动就必须设置这个,也就是说值设为scroll的View会跟随滚动事件一起滚动
◦enterAlways - 值设为enterAlways的View,当RecyclerView往下滚动时,该View会直接往下滚动
 ◦exitUntilCollapsed - 值设为exitUntilCollapsed的View,当这个View要往上逐渐“消逝”时,会一直往上滑动,直到剩下的的高度达到它的最小高度后,再响应RecyclerView的内部滑动事件。
 ◦enterAlwaysCollapsed - 当值设为enterAlwaysCollapsed 的View已经设置minHeight属性又使用此标志时,这个View只能以最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度

另外app:contentScrim="#3F51B5"是指当完全CollapsingToolbarLayout折叠(收缩)后的背景颜色

(3)在ImageView控件中,我们设置了app:layout_collapseMode="parallax",layout_collapseMode (折叠模式) - 有两个值:
 •pin - 设置为这个模式时,当CollapsingToolbarLayout完全收缩后,Toolbar还可以保留在屏幕上
 •parallax - 设置为这个模式时,在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,实现视差滚动效果,通常和layout_collapseParallaxMultiplier(设置视差因子)搭配使用

另外app:layout_collapseParallaxMultiplier="0.5"设置视差滚动因子,值为:0~1

(4)在Toolbar控件中,我们设置了layout_collapseMode(折叠模式):为pin

MainActivity.class

package com.per.appbarlayout;

import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
 public Toolbar mToolbar;
 private RecyclerView mRecyclerView;

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

  mToolbar = (Toolbar) findViewById(R.id.toolbar);
  mToolbar.setTitleTextColor(Color.GREEN);
  mToolbar.setTitle("AppBarLayout");
  setSupportActionBar(mToolbar);

  getSupportActionBar().setHomeButtonEnabled(true);
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);

  mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
  mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
  mRecyclerView.setAdapter(new ContentAdapter());

  CollapsingToolbarLayout mCollapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar_layout);
  //通过CollapsingToolbarLayout设置title
  mCollapsingToolbarLayout.setTitle("AppBarLayout");
  //通过CollapsingToolbarLayout修改字体颜色
  mCollapsingToolbarLayout.setExpandedTitleColor(Color.WHITE);//设置还没收缩时状态下字体颜色
  mCollapsingToolbarLayout.setCollapsedTitleTextColor(Color.RED);//设置收缩后Toolbar上字体的颜色
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.menu_main, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
   case android.R.id.home:
    finish();
    break;
  }
  return super.onOptionsItemSelected(item);
 }

 private class ContentAdapter extends RecyclerView.Adapter<ContentAdapter.ContentHolder> {
  @Override
  public ContentAdapter.ContentHolder onCreateViewHolder(ViewGroup parent, int viewType) {
   return new ContentHolder(LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_list_item_1, parent, false));
  }

  @Override
  public void onBindViewHolder(ContentAdapter.ContentHolder holder, int position) {
   holder.itemTv.setText("item");
  }

  @Override
  public int getItemCount() {
   return 35;
  }

  class ContentHolder extends RecyclerView.ViewHolder {

   private TextView itemTv;

   public ContentHolder(View itemView) {
    super(itemView);
    itemTv = (TextView) itemView.findViewById(android.R.id.text1);
   }
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android自定义View之组合控件实现类似电商app顶部栏

    本文实例为大家分享了Android自定义View之组合控件,仿电商app顶部栏的相关代码,供大家参考,具体内容如下 效果图: 分析:左右两边可以是TextView和Button,设置drawableTop即可,中间的看着像是EditText,但是用过淘宝天猫等类似app的话会发现点击搜索不是在当前Activit进行搜索的,是跳转到另外的页面进行的,所以用TextView然后设置背景即可. 实现流程 参数列表: 设置属性文件:values下建立attrs.xml文件,添加需要自定义的属性. <?x

  • Android实现底部导航栏功能(选项卡)

    现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能. 我们先看下该demo实例的框架图: 其中各个类的作用以及资源文件就不详细解释了,还有资源图片(在该Demo中借用了其它应用程序的资源图片)也不提供了,大家可以自行更换自己需要的资源图片.直接上各个布局文件或各个类的代码: 1. res/layout目录下的 maintabs.xml 源码: <?xml version="1.0&q

  • Android仿网易客户端顶部导航栏效果

    最近刚写了一个网易客户端首页导航条的动画效果,现在分享出来给大家学习学习.我说一下这个效果的核心原理.下面是效果图: 首先是布局,这个布局是我从网易客户端反编译后弄来的.大家看后应该明白,布局文件如下: <FrameLayout android:id="@id/column_navi" android:layout_width="fill_parent" android:layout_height="wrap_content" androi

  • Android程序开发之Fragment实现底部导航栏实例代码

    流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 说明 IDE:AS,Android studio; 模拟器:genymotion; 实现的效果,见下图. 具体实现 为了讲明白这个实现过程,我们贴出来的代码多一写,这样更方便理解 [最后还会放出完整的代码实现] .看上图的界面做的比较粗糙,但实现过程的骨架都具有了,想要更完美的设计,之后自行完善吧 ^0^. 布局 通过观察上述效果图,发现任意一个选项页面都有三部分组成: 顶部去除ActionBar后的标题栏: 中间一个Fragment

  • android底部菜单栏实现原理与代码

    上一个项目已经做完了,这周基本上没事,所以整理了下以前的项目,想把一些通用的部分封装起来,这样以后遇到相似的项目就不用重复发明轮子了,也节省了开发效率.今天把demo贴出来一是方便以后自己查询,二是希望同时也能帮到大家. 底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏做.我这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下

  • Android顶部工具栏和底部工具栏的简单实现代码

    废话少说,直接上图,有图有真相. 这两个工具栏全是用布局来实现的.底部工具栏布局代码: 代码 复制代码 代码如下: < xmlns:android="http://schemas.android.com/apk/res/android"    android:background="@drawable/bottom"    android:layout_width="fill_parent"    android:layout_height

  • Android项目实战之仿网易顶部导航栏效果

    随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候想网易新闻要显示的内容太多,而且又想在主页面全部显示出来,所以有加了顶部导航栏,但是Android这样的移动设备内存是受限的,那么多界面缓存到内存中,很容易导致内存溢出,这个是比较致命的,所以不得不考虑.虽然我在之前也做过网易的顶部导航栏但是方式并不好,就像使用viewpager做一些复杂的界面由于图片占用内存过多,很容易导致内存溢出,学习了今天的内容大家做一下对比相信

  • 3种Android隐藏顶部状态栏及标题栏的方法

    本文包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法,分享给大家供大家参考,具体内容如下 方法一 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 隐藏标题栏 requestWindowFeature(Window.FEA

  • Android实现沉浸式导航栏实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: private SystemBarTintManager tintManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // getWindow().addFlags(WindowManager.Layo

  • Android实现沉浸式通知栏通知栏背景颜色跟随app导航栏背景颜色而改变

    最近好多app都已经满足了沉浸式通知栏, 所谓沉浸式通知栏:就是把用来导航的各种界面操作空间隐藏在以程序内容为主的情景中,通过相对"隐形"的界面来达到把用户可视范围最大化地用到内容本身上. 而最新安卓4.4系统的通知栏沉浸模式就是在软件打开的时候通知栏和软件顶部颜色融为一体,这样不仅可以使软件和系统本身更加融为一体. 就是手机的通知栏的颜色不再是白色.黑色简单的两种了,本人用的小米4手机,米4手机中的自带软件都支持沉浸式通知栏, 举个例子:大家可以看一下自己的qq,它的标题的背景颜色是

随机推荐