Skip to content

xiaweizi/AndroidMD

Repository files navigation

准备

我分享主题为『Material Design In Android』。因为之前毕设项目趣闻中有用到「Support Design」库中的控件,对其比较熟悉。我分三部分准备:

  1. APP准备
  2. 文档准备
  3. Keynote准备

一、APP准备

项目已经上传到GitHub上:AndroidMD

运行效果

MD.gif

花了两个多小时做了这个APP,主要作为MD控件的功能展示,如果需要额外的特殊功能,请自行添加。

先说说完成这个APP的事前准备:

1. 主题

主题是最近非常火的「终结者2:审判日」

2. 数据

数据是自己在本地写的json数据,很是尴尬,然后部署到**七牛云**上。地址是:WeaponInfo,这样就可以直接访问地址获取json数据。

3. 语言

用的语言是之前学的**Kotlin**。Kotlin学习笔记

4. 风格

整体的风格就是我这次分享的主题 Material Desing风格。

二、整体内容结构的准备

在做PPT之前,先把结构搭好,并且把PPT的内容先准备好,到时候直接就可以复制到PPT中。

整体结构:

  1. 什么是 Material Design
  2. Material Desing的特点
  3. 从四个特点结合Android的应用剖析
  4. 在我的公司「口袋」项目中的应用

当然内容需要看官方的文档和其他资料加上总结才能完成,所以在此感谢一下文章的帮助:

Material Design 学习笔记 Material Design 官网介绍文档 Material Design 中文介绍 Material Design in Android Developer

三、PPT的准备

有了之前内容的编写,做PPT就方便一点。但是因为刚买的MAC,但又不想再装WPS套餐,于是用的是自带的keynote,所以使用上会有点生疏。不过,整个PPT制作下来对其使用也熟练了起来。

如果需要的话,可以加个QQ发给你。

1、封面

封面

进入MD官网首页就是这张图片。

2、介绍

介绍.gif

MD上截取的动画作为入口,大概讲解一下MD的基础概念和特点。

3、特点

特点.gif

这里抽取了四个点:MaterialElevationColorAnimation进行分析。

4、风格背景

文字采用圆角+阴影进行包裹,至于高度和圆角效果因为时间紧迫,没有按照严格规范进行设置,如果对这方面有要求可以参考官网详细的规范要求。

image.png

5、动画效果

说起动画,为了能够模仿MD的交互,也是现学现卖了一把。

交互.gif

其实就是背景的放大效果,再加上文字的位移效果。



我--------------是--------------分--------------割--------------线



Material Design in Android

接下来开始分享这次分享的主要内容,因为MD的介绍和规范在官网上都有非常详细全面的介绍,所以我就不赘述了,建议自己先看一遍官方网站的介绍,这样你对MD的理解会更加深入一些。那我把链接再列出一下:

Material Design`官网介绍文档 Material Design 中文介绍

当你把官网的内容大致浏览一遍,相信也对MD有个初步的了解,当然要想全部弄懂的话,还得需要消化一阵子,毕竟MD的设计规范细致入微。越读越能感受到它的妙处,假如你能严格按照它的规范进行开发项目,哪怕你不是专业的UI设计师,相信你的产品一定不会难看的。

那接下来就主要介绍一下Material DesingAndroid中应用。。

跟随着15年Android 5.0的问世,谷歌设计师们还给我们带来的一系列的具有Material Design风格控件。这些控件被统一放置在support design库中,以供开发中使用。使用这些库的前提是API>=21,当然如果你想在 5.0 一下的设备这些控件的话,需要添加appcompat包进行向下兼容。

image.png

我的design版本是26.1.0,上图大概就是design提供的API,这里我只做简单的使用介绍,如果想了解其原理的话,可以看一下官方的介绍。

这么多我该从何说起呢?我想了下,就按照我做这个小项目,需要的控件顺序说起吧,这样也相当于大家跟我一起做出一个具有Material Design风格的APP了。

1、主题

一个项目的开始,你得先确定这个项目的主题颜色是什么?你可以使用谷歌给你提供的Material Theme:

  • @android:style/Theme.Material(深色版本)
  • @android:style/Theme.Material.Light(浅色版本)
  • @android:style/Theme.Material.Light.DarkActionBar

当然,也可以使用自定义的主题,先看一下最为常见的图片:

image.png

可以通过定制不同的类别的主题颜色,来达到预期的主题效果。

  • colorPrimary 项目主颜色,一般是Titlebar的背景颜色
  • colorPrimaryDark 比主颜色深一点颜色,一般是状态栏颜色
  • textColorPrimary 文字的主颜色
  • windowBackground 窗口背景颜色
  • navigationBarColor 导航栏颜色

通过在styles中配置颜色来定制您的主题,并在AndroidManifest中应用。

2、BottomNavigationView

主题构建好了,下面就是主要内容架构,我大致分为四个模块:武器简介、人物简介、配件简介和空投简介。那么底下就需要一个tab进行切换,BottomNavigationView便开始登场。从名字就可以看出 「底部导航view」,主要的作用在于给每个模块一个导航定位的功能,相信大家在众多App中都能发下底部导航view的身影。

先看一下效果:

bottomNavigationView.gif

  1. menu/下创建菜单文件:

     <menu xmlns:android="http://schemas.android.com/apk/res/android">
         <group android:checkableBehavior="single">
             <item
                 android:id="@+id/bottom_weapon_inc"
                 android:icon="@drawable/about"
                 android:title="@string/weapon_inc" />
             <!--  省略部分代码     -->
         </group>
     </menu>
    
  2. XML中进行引用

     <android.support.design.widget.BottomNavigationView
         android:id="@+id/navigation"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:itemBackground="@color/colorPrimary"
         app:itemIconTint="@android:color/white"
         app:itemTextColor="@android:color/white"
         app:menu="@menu/bottom_menu"/>
    
  3. 代码中设置点击事件

     navigation!!.setOnNavigationItemSelectedListener {}
    

3、DrawerLayout、NavigationView

BottomNavigationView相对应的,不得不介绍一下NavigationView,这两者都是导航View,后者一般需要配合DrawerLayout实现侧滑菜单效果。

请看效果:

DrawerLayout.gif

XML直接引用

<android.support.v4.widget.DrawerLayout
        android:id="@+id/dl_main"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="0dp">
        <!-- 主内容 -->
        <FrameLayout
            android:fitsSystemWindows="true"
            android:id="@+id/fl_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </FrameLayout>
        <!-- 侧滑菜单内容 -->
        <android.support.design.widget.NavigationView
            android:id="@+id/nv_left"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/nav_header"
            app:menu="@menu/nav_menu"/>
    </android.support.v4.widget.DrawerLayout>

通过配置layout_gravity的属性来设置侧滑的方向:start:从左侧划出,end从右侧划出。

headerLayout: 设置其头布局
menu: 设置菜单布局

详细使用请看我之前写的一篇博客:高大上的DrawerLayout

4、Toolbar

整体的架构搭建好了,剩下就是开始每个模块的内容了,内容当然少不了标题,那么就开始介绍一下Toolbar

Toolbar作为早期AndroidActionBar的替代品,定制性和操作性挺高了不少。使用的时候需要设置NoActionBar的主题。

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"></style>

5、RecyclerView+SwipeRefreshLayout

项目中列表肯定是少不了的,那么这就不得不提RecyclerView了,强大之处不用多说,感兴趣的话看一下我之前写的博客,对其使用有个简单的介绍:简单粗暴RecyclerView

那如果想实现侧滑删除和长按拖拽的功能怎么办呢?RecyclerView原生就支持这些,只需要继承ItemTouchHelper.Callback的类,并实现它几个抽象方法即可。

  1. 创建实现ItemTouchHelper.Callback的类

     internal inner class ItemTouchHelperCallback : ItemTouchHelper.Callback() {
         override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
             val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
             val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
             return makeMovementFlags(dragFlags, swipeFlags)
         }
    
         override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
             myAdapter!!.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
             return false
         }
    
         override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
             myAdapter!!.onItemDismiss(viewHolder.adapterPosition)
         }
     }
    
  2. RecyclerView建立连接

     val mItemTouchHelper = ItemTouchHelper(ItemTouchHelperCallback())
     mItemTouchHelper.attachToRecyclerView(mRecyclerView)
    

实现效果如下:

RecyclerView.gif

6、CardView

列表结构写好了,里面内容得优化吧,CardView自带圆角和阴影效果,让每个Item看起来就非常的自然,正如其名像卡片一样,也符合了Material Design特点。

作为ViewGroup包裹子View实现圆角和阴影的效果:

<android.support.v7.widget.CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="2dp"
    app:cardCornerRadius="5dp"
    app:cardElevation="5dp">
</android.support.v7.widget.CardView>

主要由两个属性控制:

  • cardCornerRadius:圆角半径
  • cardElevation:高度(直接影响阴影的大小)

7、CoordinatorLayout+AppBarLayout+Toolbar

列表写好了,接下来就是滑动的交互,CoordinatorLayout:作为根View或者是一个活多个子View特定的容器,用于协调子View之间滑动的交互,可以说CoordinatorLayout是整个Design库中最核心的控件。

AppBarLayout其实就是LinearLayout,通过layout_scrollFlags来控制滑动的效果。前提是滑动view必须实现NestedScrollingChild的接口,且需要配置behavior,最基本的使用就是:

<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:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:fitsSystemWindows="true"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:layout_scrollFlags="scroll|enterAlwaysCollapsed"
            app:popupTheme="@style/Theme.AppCompat.Light" />
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:foregroundGravity="center" />
    </android.support.v4.widget.SwipeRefreshLayout>

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

有两个重点:

  • 滑动的view必须实现NestedScrollingChild接口。比如RecyclerViewNestedScrollView.
  • 必须配置behaviorapp:layout_behavior="@string/appbar_scrolling_view_behavior"

重点看一下layout_scrollFlags有哪些属性,为了方便理解,将可以滑动的view简称为ScrollView,设置了layout_scrollFlags称为DependentView,两者滑动事件的传递通过配置不同的layout_scrollFlags达到不同的交互效果。

1. scroll

view必须设置该属性其他的属性的才会生效,这个是最基本的属性。

2. scroll|enterAlways

DependentView事件处理的优先级要大于ScrollView,当手指在屏幕上滑动,滑动事件便首先交给DependentView处理,当DependentView滑动结束才会将事件交给ScorllView。也就是下面的效果:

enterAlways.gif

3. scroll|enterAlwaysCollapsed

ScrollView向下滑动时,DependentView先折叠到最小高度(这里是0),然后将事件交给ScrollView,当ScrollView滑动结束,DependentView才继续滑动事件,直至展开,如下图所示:

enterAlwaysCollapsed.gif

4. scroll|enterAlwaysCollapsed|enterAlways

这边就展示一下折叠的效果,我们先设置最小的高度

    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:minHeight="50dp"
        app:layout_scrollFlags="scroll|enterAlwaysCollapsed|enterAlways" />

展示一下效果:

see.gif

5. scroll|exitUntilCollapsed

这个搭配重点在于上拉的时候,DependentView会先折叠到最小高度,然后事件全部交给ScrollView。那下拉的时候就是当ScrollView滑动结束,才开始DependentView的滑动事件。

exitUntilCollapsed.gif

6. scroll|enterAlways|snap

这个snap就是在上面的基础上多了一个回弹的效果,一般需要配合上其他属性使用才会有效果。当DependentView正在滑动,此时手指离开屏幕时,DependentView会自动移动到离自己较近的终点或者始点。效果如下:

snap.gif

上面的属性完全可以像第四种情况叠加使用,至于效果自己尝试了了才能感觉到它的奥妙之处。

8、转场动画

交互有了,现在看是添加点击跳转效果了。咱们之前跳转动画都是在startActivity之后调用overridePendingTransition方法,传入进入和退出的动画实现跳转动画。Android 5.0提供了强大的转场动画,给每个item赋予了生命,我们可以把Activity的跳转比作一次搬迁大运动,而布局中的每个view都参与到了这次搬迁运动中。

使用时,需在setContentView()之前加上

window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)

跳转时候这样写:

startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(activity).toBundle())

跳转的界面设置转场动画或者出场动画:

    window.enterTransition = Explode()
    window.exitTransition = Slide()

谷歌给我提供了三种转场方式:

  • Explode() 突然的变形
  • Slide() 自然的滑动
  • Fade() 渐变

为了看出效果我设置了2s的延迟:

Transition.gif

9、Toast、SnackBar和AlertDialog

基本的界面写完了,剩下的就是一些逻辑上的操作啦,比如「提示」。那么Android提示分为三种:

  • 友好的Toast(比如网络失败)
  • 拥有附加行为的提示SnackBar(比如误删信息回撤)
  • 强制让用户做出选择的AlertDialg(比如未登录)

那么这三种的效果是什么呢?

TSA.gif

大概先讲这些,有时间再进行后续补充。

Material Design在「口袋」中的应用

其实在咱们的「口袋贵金属」项目中也到找到很多MD的元素。

首先是点击的水波纹效果:

ripple.gif

其次是交易圈的滑动交互:

circle.gif

还有就是本人在「口袋」接手的第二个需求,「个人中心」。看一下效果:

personal.gif

严格按照Material Design风格进行开发,相信一定能开发出非常漂亮的APP!!

About

Material Design 在 Android 中的应用

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages