android技术分享主题,如何做技术分享 | Material Design 在 Android 中的应用

1、主题

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

@android:style/Theme.Material(深色版本)

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

@android:style/Theme.Material.Light.DarkActionBar

当然,也可以使用自定义的主题,先看一下非常普遍的图片:

c4cd75d8c65b6e26b5f80dcb1190ee43.png

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

colorPrimary 项目主颜色,一般是Titlebar的背景颜色

colorPrimaryDark 比主颜色深一点颜色,一般是状态栏颜色

textColorPrimary 文字的主颜色

windowBackground 窗口背景颜色

navigationBarColor 导航栏颜色

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

2、BottomNavigationView

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

先看一下效果:

194ba1facd8778ae2425a7f287a55573.gif

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

android:id="@+id/bottom_weapon_inc"

android:icon="@drawable/about"

android:title="@string/weapon_inc"/>

2.XML中进行引用

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实现侧滑菜单效果。

请看效果:

89364b574f86919cd3a3ff3d87a82b35.gif

在XML直接引用

android:id="@+id/dl_main"

android:layout_width="match_parent"

android:layout_weight="1"

android:layout_height="0dp">

android:fitsSystemWindows="true"

android:id="@+id/fl_content"

android:layout_width="match_parent"

android:layout_height="match_parent">

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"/>

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

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

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

https://www.jianshu.com/p/ce8a7a20c03c

4、Toolbar

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

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

5、RecyclerView+SwipeRefreshLayout

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

https://www.jianshu.com/p/60819de9eb42

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

1. 创建实现ItemTouchHelper.Callback的类

internalinner classItemTouchHelperCallback: ItemTouchHelper.Callback() {

overridefungetMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int{

valdragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN

valswipeFlags = ItemTouchHelper.START or ItemTouchHelper.END

returnmakeMovementFlags(dragFlags, swipeFlags)

}

overridefunonMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean{

myAdapter!!.onItemMove(viewHolder.adapterPosition, target.adapterPosition)

returnfalse

}

overridefunonSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int){

myAdapter!!.onItemDismiss(viewHolder.adapterPosition)

}

}

2. 和RecyclerView建立连接

valmItemTouchHelper = ItemTouchHelper(ItemTouchHelperCallback())

mItemTouchHelper.attachToRecyclerView(mRecyclerView)

实现效果如下:

927b5279db27cc3c8d3b96ba51abcf28.gif

6、CardView

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

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

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="2dp"

app:cardCornerRadius="5dp"

app:cardElevation="5dp">

主要由两个属性控制:

cardCornerRadius:圆角半径

cardElevation:高度(直接影响阴影的大小)7、CoordinatorLayout+AppBarLayout+Toolbar

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

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

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:id="@+id/appbar"

android:layout_width="match_parent"

android:layout_height="wrap_content">

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:id="@+id/refresh_layout"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:layout_behavior="@string/appbar_scrolling_view_behavior">

android:id="@+id/recyclerView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:foregroundGravity="center"/>

有两个重点:

滑动的view必须实现NestedScrollingChild接口。比如RecyclerView、NestedScrollView.

必须配置behavior。app:layout_behavior="@string/appbar_scrolling_view_behavior"

来看一下layout_scrollFlags有哪些属性,为了方便理解,将可以滑动的view简称为ScrollView,设置了layout_scrollFlags称为DependentView:

1. scroll

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

2. scroll|enterAlways

只要ScrollView滑动,滑动事件就会交给设置DependentView,当DependentView滑动结束才会将事件交给ScorllView。也就是下面的效果:

501e548a4bec39e61a09a3c49c7792ca.gif

3. scroll|enterAlwaysCollapsed

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

24aadd453b9985bae37b2aa0cdd0ee2b.gif

4. scroll|enterAlwaysCollapsed|enterAlways

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

android:layout_width="match_parent"

android:layout_height="100dp"

android:minHeight="50dp"

app:layout_scrollFlags="scroll|enterAlwaysCollapsed|enterAlways"/>

展示一下效果:

af6cd9c30d84816af62fc46c103121e8.gif

5. scroll|exitUntilCollapsed

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

8ddc2250450ff1ea6961ba7aab745eed.gif

6. scroll|enterAlways|snap

这个snap就是在上面的基础上多了一个回弹的效果,当DependentView正在滑动,此时手指离开屏幕时,DependentView会自动移动到离自己较劲的终点或者始点。效果如下:

f7ff7af0944b6a699a5792ba8f1d9191.gif

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

8、转场动画

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

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

window.requestFeature( Window.FEATURE_CONTENT_TRANSITIONS)

跳转时候这样写:

startActivity( intent,

ActivityOptions.makeSceneTransitionAnimation( activity) .toBundle())

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

window.enterTransition = Explode()

window.exitTransition = Slide()

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

47198f201033bc4edbdeab83fcd2f562.gif

9、Toast、SnackBar和AlertDialog

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

友好的Toast(比如网络失败)

拥有附加行为的提示SnackBar(比如误删信息回撤)

强制让用户做出选择的AlertDialg(比如未登录)

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

24bb9962e7cbec28526aec9ec0242564.gif

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

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

我的博客

http://xiaweizi.cn/

大厂App 性能分析与优化方案研究返回搜狐,查看更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值