使用Android L新特性开源项目-Aiguille

jopen 9年前

原文  http://www.cnblogs.com/kevinOne/p/4487202.html

    项目地址: https://github.com/wwkai555/Aiguille    

    这个项目主要使用Android L新特性 - 最新的widget以及一些值得推荐和使用的开源库比如butterknife,volley等等。然而后续也将会采用更多优秀的开源技术展示。这篇文章先就大致的介绍下该项目采用的最新widge知识和相关的开源库技术。

1.RecyclerView

    RecyclerView可以说是ListView的升级版,因为它使用起来非常的方便和简单。可以看下谷歌的官方文档:

RecyclerView  is a more advanced and flexible version of  ListView . This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the  RecyclerView  widget when you have lists with elements that change dynamically.

我们可以看出,RecyclerView就是用来显示大量数据的容器和ListView一样。它可以非常高效的重用和滚动,当你的视图上的元素经常动态的且有规律的改变时候,可以使用RecyclerView控件。我们之前在使用listview的时候,都会负责为每一个item布局管理,同时还有自己处理item的复用机制,用多了就会感觉挺累赘的,然而RecycleView将不再有这些问题的存在了,RecyclerView现在不再负责布局,只专注于复用机制,布局交由LayoutManager来管理。 RecyclerView仍然通过Adapter来获取需要显示的对象,只不过这个Adapter不再是继承BaseAdapter而是继承 RecycleView自带的RecyclerView.Adapter,并且最好指定一个继承自RecyclerView.ViewHolder的范型,Adapter不再要求你返回一个View,而是一个ViewHolder。继承自Adapter后,需要实现3个抽象方法:

1>.当RecyclerView需要一个ViewHolder时会回调该方法,如果有可复用的View则该方法不会得倒回调</span>

   public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i);

2>.当一个View需要出现在屏幕上时,该方法会被回调,你需要在该方法中根据数据来更改视图  public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i);
3>.用于告诉RecyclerView有多个视图需要显示  public int getItemCount();

    新的Adapter和原有的Adapter并没有太多的差别,只是不再需要我们写复用判断的逻辑,因为复用逻辑其实都是相似的,它已经有了自身的实现。和原有的Adapter一样,仍然可以通过notifyDataSetChanged来刷新UI,通过getItemViewType来获取对应位置的类型,但是它不再需要你指定有多少类型了,因为该方法已经能够判断出有多少类型。新增的onViewRecycled方法可以让使用者监听View被移除屏幕的时机,并且还提供了一个AdapterDataObserver的观察者,对外提供数据改变时的回调。

ViewHolder是对所有的单个item的封装,不仅包含了item需要显示的View,并且还包含和item相关的其它数据,例如:当前的position、之前的position、即将显示的position、被回收的次数、View的类型、是否处于显示中等信息。创建一个ViewHolder需要传递一个View对象,这个View就是该holder的显示视图,该View中通常会包含一些子视图,我们最好把这些子视图都记录在holder中,便于复用时设置不同的数据。

RecyclerView不再对布局进行管理,而是通过LayoutManager管理布局,我们可以通过继承自LayoutManager来实现特殊的布局,系统提供了三种常用的布局管理器:

  1. LinearLayoutManager 线性布局
  2. GridLayoutManager 九宫格布局
  3. StaggeredGridLayoutManager 瀑布流布局

并且每一种都可以设置横行和纵向的布局,可惜的均不能添加header,如果要添加header,我们可以在Adapter中使用不同的类型来达到该效果。

RecyclerView默认提供了item的增加和删除的动画效果,如果我们使用自定义的动画,需要继承继承RecyclerView.ItemAnimator类,时候时,通过RecyclerView.setItemAnimator()方法来设置我们自定义的动画。

 

2.CardView

  CardView继承自FrameLayout类,在实现扁平化的UI处理上,通常离不开阴影和圆角,我们通常是让美工提供一个带有阴影和圆角效果的背景图片,现在我们有了更好的实现方式,那就是CardView。,可以在一个卡片布局中一致性的显示内容,卡片可以包含圆角和阴影。CardView是一个Layout,所以可以布局其他View。对于其的阴影效果和圆角效果更其它的view一样既可以在xml布局中设置也可以在代码中直接设置,阴影效果可以使用cardElevation属性或者使用setCardElevation方法即可达到一致的效果,圆角效果则可以使用cardCornerRadius属性或者setRadius方法即可一致

 

3.ToolBar

    ToolBar也是Android L中引入一个新widget,可以把他视为actionbar的升级版,因为它可以取代actionbar了。我们知道以往我们在使用actionbar的时候非常不灵活因为它是一个固定的形式,然而toolbar将会改变这一切,我们先看下官方给出的文档:

  • Use a Toolbar as an Action Bar when you want to use the existing Action Bar facilities (such as menu inflation and selection, ActionBarDrawerToggle, and so on) but want to have more control over its appearance.

  • Use a standalone Toolbar when you want to use the pattern in your app for situations that an Action Bar would not support; for example, showing multiple toolbars on the screen, spanning only part of the width, and so on.

   (1)将Toolbar当作actionbar来使用。这种情况一般发生在你想利用actionbar现有的一些功能(比如能够显示菜单中的操作项,响应菜单点击事件,使用ActionBarDrawerToggle等),但是又想获得比actionbar更多的控制权限。

   (2)将Toolbar当作一个独立的控件来使用,这种方式又名Standalone

如果你要使用第一种方式,toolbar的具体的表示就可以通过xml布局定制化实现。那么之前你得要去掉actionbar,最简单的方法是使用Theme.AppCompat.NoActionBar主题。或者是设置主题的属性android:windowNoTitle为true。然后在Activity的onCreate中调用setSupportActionBar(toolbar),原本应该出现在ActionBar上的menu会自动出现在actionbar上。同样你如果采用第二种方法,将Toolbar当作一个独立的控件来使用是不需要去掉actionbar的(两者可以共存),可以使用任意主题。但是在这种情况下,menu菜单并不会自动的显示在Toolbar上,Toolbar也不会响应菜单的回调函数,如果你想让menu菜单项显示在Toolbar上,必须手动inflate menu。

 

4.Palette

     Palette就是一个取色器,它可以从图像中提取突出的颜色,这样可以把色值赋给toolbar、或者其他view,可以让界面整个色调统一。

Palette这个类中提取以下突出的颜色:

Vibrant  (有活力)

Vibrant dark(有活力 暗色)

Vibrant light(有活力 亮色)

Muted  (柔和)

Muted dark(柔和 暗色)

Muted light(柔和 亮色)

具体实现见Aiguille项目。

 

5.butterknife

    ButterKnife是一个专注于Android系统的View注入框架,让你从此从这些烦人臃肿的代码中解脱出来。具体的实现细节这里就不列举,可以直接看项目源码,一看就明白就会使用了。(使用时别忘了配置,配置的过程网上应该不少,如果实在还是有问题可以留言)。

 

6.volley

    Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。从名字由来和配图中无数急促的火箭可以看出 Volley 的特点:特别适合数据量小,通信频繁的网络操作。(个人认为 Android 应用中绝大多数的网络操作都属于这种类型)。

 Volley 的主要特点

(1). 扩展性强。Volley 中大多是基于接口的设计,可配置性强。
(2). 一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。
(3). 默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 实现
(4). 提供简便的图片加载工具。

 

    以上就大致的介绍了下,具体的各个widget以及开源库的使用细节,Aiguille项目都给出了,欢迎fork。

   项目地址: https://github.com/wwkai555/Aiguille