Material Design on Android
来源:互联网 发布:绅士软件 编辑:程序博客网 时间:2024/05/03 23:01
Material Design on Android
1. Pre.
UI设计一直是我们码农比较头疼的事情,自己想做app,但是又设计不出好的UI,做不出好看的控件。2014年谷歌推出了一套新的UI框架:Material Design(翻译为原质化设计),这是一套很新颖的设计框架,它的设计目标为:
n 具有实体感
n 鲜明、形象、深思熟虑
n 有意义的动画效果
Google希望创造一种独一无二的底层系统,在这个系统的基础之上,构建跨平台和超越设备尺寸的统一体验。遵循基本的移动设计定则,同时支持触摸、语音、鼠标、键盘等输入方式。
Google还打算把MaterialDesign做成行业UI设计标准。但是在我们无线端,想要自己按照他的那套标准做出那种效果,非常难,因为牵涉到很多动画、美术、显示的效果,非专业人员很难到达。不过,幸运的是在今年前不久的Google I/O大会上,谷歌推出了Android Design Support Library框架,提供了一些的MaterialDesign UI控件,这对我们来说简直就是福音啊啊啊啊。虽然组件不多,但是都是比较实用的,相信Google之后会继续扩充这个Library。下面我们来一一介绍这些MaterialDesign的组件。
PS:完成以下操作之前,需要依赖一个库:
com.android.support:design:22.2.0
2. FAB (FloatingActionButton)
这是一种带阴影的圆形悬浮按钮,具有很好的阴影效果和点击质感,可以很方便的调整它的阴影大小。
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:src="@drawable/ic_plus"
app:fabSize="normal"
app:elevation="6dp"
app:pressedTranslationZ="12dp"
app:backgroundTint="@color/nav_item_icon_tint_color" />
fabSize :调整按钮的大小的提供了 mini和normal两种值。
elevation:没有触碰按钮时阴影的大小,默认值(推荐值)是6dp。
pressedTranslationZ:按下按钮时阴影的大小,默认值(推荐值)是12dp。
backgroundTint:圆形按钮的颜色可以很方便的调整。
3. Snackbar
这是一种类似Toast的用于展示短消息的黑色小条,它位于屏幕的底部,和Toast不同的是,第一,它是在屏幕中显示的,而不是像Toast一样浮于屏幕之上,换句话说他是的屏幕的一部分;第二,他可以向右滑动移除信息。第三他可以点击触发事件,这点与Notification有点像。
Snackbar.make(drawerLayout,"Hello. I am Snackbar!",Snackbar.LENGTH_LONG). setAction("do", new View.OnClickListener() { @Override public void onClick(View v) { } }).show();
它的用法很简单,和Toast很相似,make(someview view, String string, time t)用于创造一个Snackbar,view是你想显示在的那个界面,string是要显示的信息,t是要显示的时间,和Toast一样只支持长、短两种显示时间。
setAction(String string, OnClickListener())方法是一个可选项,如果调用了,则在Snackbar的又边创建一个Text=string,该Text可以点击,点击后Snackbar马上下滑消失。同时可以在onClick()里执行其他操作,跳转或者进行其他事件。
有一个问题是这样显示的Snackbar显示的时候会覆盖FAB,如果想让他们不覆盖的相互显示,需用到下一个控件CoordinatorLayout。
4. CoordinatorLayout
如其名字,是为了让在它里面的某些特定的子控件协调的工作的,这些特定的控件包括Snackbar和FAB和其他一些AppBarLayout。将Snackbar和FAB一同放在CoordinatorLayout之后,它们两的显示就不会重叠了,而会和谐的出现在一个屏幕里。值得注意的是,所有在CoordinatorLayout内部的控件,都必须是Coordinator的,如果不满足这个条件,那么其显示将会出问题。如果需要在CoordinatorLayout放置android原有的控件如Button或者Textview等,那么可以在他们外面套上AppBarLayout。如果有布局,则在相应的布局上加上属性:
app:layout_behavior="@string/appbar_scrolling_view_behavior"
所有的Coordinator控件包括: FAB、Snackbar、AppBarLayout、NestedScrollView、RecyclerView、CardView、Navigation Drawer、TextInputLayout等。
5. Toolbar
Toolbar其实不属于Android DesignSupport Library,但是能够很好的与其他Material design的控件结合起来,使效果更为美观。相比Actionbar Toolbar最明显的一点就是变得很自由,可随处放置,因为它是作为一个ViewGroup来定义使用的,
首先需要在style里隐藏ActionBar。
<style name="AppTheme.WithoutActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item></style>
然后在布局文件里面,CoordinatorLayout里加入Toolbar.
<android.support.design.widget.AppBarLayout 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" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /></android.support.design.widget.AppBarLayout>
由于Toolbar不是Coordinator的控件,所以需要在他外面套一层Coordinator的控件,例如AppBarLayout。
然后在java里
toolbar =(Toolbar)findViewById(R.id.toolbar);setSupportActionBar(toolbar);
setSupportActionBar()一下,就可以了。
6. TabLayout
Tab 是在 Android 应用程序中用户体验最佳实践的一部分。在以前,如果我们想要使用新的材料设计风格的 Tab,我们需要自己去为项目中下载 SlidingTabLayout 和 SlidingTabStrip 的源码。现在,我们只需要使用这个库提供的 TabLayout,它也有很多可以调整的选项。
它应该在阴影部分的上面。所以,我们将其放在AppBarLayout 里面,沿着Toolbar。这是可以做到的,因为AppBarLayout是继承自一个垂直的LinearLayout。
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="center"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
/>
app:theme这个参数可以改变tab的颜色。
app:tabMode 如果你想在屏幕上显示出每个单独的 tab,就设置 tab 为 fixed 的。它适合只有少数 tab 的时候,但是如果有很多的 tab 的时候这是一个完全错误的选择。在这种情况下你是不确定所有的 tab 是否能很好的在同一时间显示出来的。所以,你可以设置这个属性为 scrollable 让用户去滚动tab,就像Google Play Store那样。
app:tabGravity -如果你想要分配所有的可用空间给每个tab,就设置这个属性为 fill。如果你想要所有的 tab 在屏幕的中间,就设置这个属性为 center。如果 tabMode是设置成scrollable的,则这个属性将会被忽略。
接着还要在java代码中添加一些代码
tabLayout= (TabLayout) findViewById(R.id.tabLayout);
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
tablayout就完成了,一般tablayout还需要与viewpager联用。
viewPager=(ViewPager)findViewById(R.id.vPager);
PagerAdapteradapter = newPagerAdapter(getSupportFragmentManager(),tabLayout.getTabCount());
viewPager.addOnPageChangeListener(newTabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(newTabLayout.OnTabSelectedListener()
{
@Override
public void onTabSelected(TabLayout.Tab tab)
{
viewPager.setCurrentItem(tab.getPosition());
}
……
});
viewPager.setAdapter(adapter);
在这里有一些额外的用法:
如果在toolbar下的页面是一个可以向下拉动的页面,如类似ListView或者ScrollView(为什么说类似,因为这里ListView和ScrollView都不是Coordinate的,直接用不会有效果,所以ListView要用RecyclerView代替,ScrollView要用NestedScrollView代替),那么在Toolbar或者Tablayout中加入app:layout_scrollFlags属性,可以选择它是否随着向下拉动或者向上拉动的被移除,或者停在某个位置。
app:layout_scrollFlags有四个属性,分别是以下:
Scroll
:
要设置这个view随着内容滚动,就必须加上这个属性。
enterAlways
:
这个标志确保了任何向下滚动的操作都会让这个view变得可见,达到“快速返回”的效果。
enterAlwaysCollapsed :这个标志定义了 View 是如何回到屏幕的。当你的 view 已经声明了一个最小高度(minHeight) 并且你使用了这个标志,你的 View 只有在回到这个最小的高度的时候才会展开。
exitUntilCollapsed:View 将关闭滚动直到它被折叠起来(minHeight) 并且一直保持这样。
7. CollapsingToolbarLayout
现在Toolbar可以展开和折叠,但是你会看到它还不是很完美。Toolbar 仍然离开了屏幕,最好的体验是让这些 icon留在屏幕内。
Design SupportLibrary 已经为这个准备好了。用 CollapsingToolbarLayout 你可以像魔术一样让 Toolbar 折叠起来,就像其他组件一样,它是非常容易使用的,具体操作步骤如下:
n 用 CollapsingToolbarLayout 包裹 Toolbar,但仍然在 AppBarLayout 中
n 从 Toolbar 中删除 layout_scrollFlags
n 为 CollapsingToolbarLayout声明 layout_scrollFlags,并且将 layout_scrollFlags 设置成 scroll|exitUntilCollapsed
n 改变 AppBarLayout 扩张状态时的布局高度大小。在这个例子中,我用256dp。
n 在toolbar中设置属性layout_collapseMode="pin"以锁定tool icons。
这样设置之后,Toolbar的标题会消失,这时候我们必须通过在Java代码中手动设置 setTitle(String) 来实现。
collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsingToolbarLayout);collapsingToolbarLayout.setTitle("Design Library");
由于CollapsingToolbarLayout的特点,应用的标题文字在收缩和展开状态是会自动过渡的。如果你想要在展开状态改变标题文字的位置,你可以这样做:
通过设置组件的 margin 的4个属性:
app:expandedTitleMargin、
app:expandedTitleMarginBottom、
app:expandedTitleMarginEnd、
app:expandedTitleMarginStart。
如果你想要在折叠和展开状态时改变文本的显示。可以设置
app:collapsedTitleTextAppearance 和
app:expandedTitleTextAppearance 来设置。
在某些情况下,我们想要用一张美丽的图片作为App Bar的背景,而不只是像现在这样的一个普通的颜色。幸运的是CollapsingToolbarLayout是继承自 FrameLayout所以我们可以轻松的添加一个ImageView作为 Toolbar的背景图层,就像这样:
<ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/header" app:layout_collapseMode="parallax" /> /><android.support.v7.widget.Toolbar
移除了Toolbar里面的属性:android:background="?attr/colorPrimary",
可以让Toolbar的颜色变成图片的颜色。
我们可以使用视差模式让它变得更优雅一些,像下面这样在ImageView里加上一个属性:app:layout_collapseMode="parallax"
你也可以设置视差的系数,介于 0.0-1.0之间。
app:layout_collapseParallaxMultiplier="0.7"
最后你可能会注意到App Bar 的背景总显示一张图片。你可以让它在收缩的时候自动的变化到普通的颜色,通过声明属性像下面这样来实现:
app:contentScrim="?attr/colorPrimary"
8. NavigationView
现在从左侧拉出Drawer Menu 仍然只是一个空白的面板。在以前,实现这个菜单是非常麻烦的,因为我们不得不手动的用 LinearLayout 或者 ListView 去实现。
在 Android DesignSupport Library 中提供了 NavigationView,实现它变得更容易了。
首先,为 Drawer Menu 创建一个标题布局文件和一个菜单资源文件再使用NavigationView 与两个资源文件绑定起来。
<android.support.design.widget.NavigationView android:id="@+id/navigation" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/nav_header" app:itemIconTint="#333" app:itemTextColor="#333" app:menu="@menu/navigation_drawer_items" />
NavigationView 就是为了 Drawer Menu 而特别设计的。所以,所有的东西都会被创建并且自动测量包括菜单的宽度等,我们自己定义案例来配置以前的设计。
为了处理这些菜单项的点击事件,你可以声明
setNavigationItemSelectedListener 来监听,就像下面这样:
navigation.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { int id = menuItem.getItemId(); switch (id) { case R.id.navItem1: break; case R.id.navItem2: break; case R.id.navItem3: break; } return false; }});
9. TextInputLayout
你可以改变一个旧的 EditText 的风格,让它变得更时髦,即:总是会显示一个提示或者一个错误信息。
要做到这一点,只需要简单的用TextInputLayout 包裹住一个 EditText ,就这么简单!
<android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Password" /></android.support.design.widget.TextInputLayout>
以上是Android Design Support Library 22.0支持的MaterialDesign组件,其实还有一些Material Desgin的组件在android5.0中,以下三个控件:CardView、RecyclerView和Paletter有单独的引用库,可以直接去引用。
10. CardView
CardView 是一个新的View,继承自FrameLayout,以卡片式显示一致的外观,它可以有阴影和圆角。使用它需要依赖:'com.android.support:cardview-v7:22.2.0'。
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_gravity="center" android:layout_width="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_height="70dp" card_view:cardCornerRadius="4dp"> <TextView android:id="@+id/info_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="haha"/></android.support.v7.widget.CardView>
如上面所示,CardView使用起来特别方便,你可以把他当做一个ListView的item来显示。
11. RecyclerView
RecyclerView是ListView的升级版,它提供了更好的性能和灵活性而且更容易使用。RecyclerView这个控件是一个可以装载大量的视图集合,并且可以非常效率的进行回收和滚动。当你list中的元素经常动态改变时可以使用RecyclerView控件。
RecyclerView非常容易使用,它提供了如下两个功能:
为每个条目位置提供了layout管理器(RecyclerView.setLayoutManager)为每个条目设置了操作动画(RecyclerView.setItemAnimator)。
RecyclerView.Adapter为默认自带和基于ViewHolder的新的适配器,只不过回调方法稍有不同,但本质都是一样的。
RecyclerView可以很方便的实现:GridView、横向ListView、横向ScrollView的功能。它可以通过setLayoutManager()来调用对应的Layout属性,来改变RecyclerView。
而RecyclerView的强大在于:
n 实现瀑布流效果
n 方便的增加和移除item动画
实现瀑布流只需要设置layoutManager为StaggeredGridLayoutManager,然后把每个item设置为随机高度即可出现瀑布流。
添加动画:mRecyclerView.setItemAnimator(new DefaultItemAnimator());
这里有一点与ListView不一样的是,这里如果想使用动画不是用notifyDataSetChanged(),而是用notifyItemInserted()与notifyItemRemoved() 来替代。
public voidaddData(intposition)
{
mDatas.add(position,"Insert One");
mHeights.add( (int) (100+ Math.random() * 300));
notifyItemInserted(position);
}
public void removeData(intposition)
{
mDatas.remove(position);
notifyItemRemoved(position);
}
使用RecyclerView需要需要添加库:com.android.support:recyclerview-v7:22.2.0
12. Palette
我觉得Palette是MaterialDesign里面让我很surprise的设计,它能让你从图像中提取突出的颜色,来决定标题的颜色和标题栏的背景色,这样视觉上更具有冲击力和新鲜感。
你可以直接传递一个位图对象给Palette.generate()静态方法。或者,如果你需要在网络上加载图片,则调用Palette.generateAsync()方法,异步监听图像,并且提供一个监听器去替代。一旦图像加载好了则会获取对应的颜色。
Palette.generateAsync(bitmap,
new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
Palette.Swatch vibrant =
palette.getVibrantSwatch();
if (vibrant != null) {
holder.relativeLayout.setBackgroundColor(
vibrant.getRgb());
holder.photoAuthor.setTextColor(
vibrant.getTitleTextColor());
}
}
});
Pattle能提取的颜色有以下几种:
Vibrant(充满活力的)
Vibrant dark(充满活力的黑)
Vibrant light(充满活力的亮)
Muted(柔和的)
Muted dark(柔和的黑)
Muted lighr(柔和的亮)
使用相应的色彩能够使你的app提高一个层次。
compile'com.android.support:palette-v7:22.2.0'
13. Sum
Android 5.0lollipop上其实还提供了一系列的Material Design。包括了:
n Material主题和布局
n View视图和阴影
n Animation动画
其中我觉得动画是扩充最大的地方,使android5.0完全变成了另一种体验。
由于时间关系上面的几个东西还来不及研究,后面有时间会研究完。
Material Design提供了一个新的设计设计框架,这种设计框架必将成为行业标准。
……………………………………………………………………………………………………………………………………………………………………
去年实习的时候写的文章,现在发出来
- Material Design on Android
- Android:Material Design on Android Checklist!
- How to build material design on android
- Android Material Design尝鲜
- Android Material Design
- Android Material Design Dialog
- Android:Material Design详解
- Android Material Design:PopupMenu
- Android Material Design:ListPopupWindow
- Android Material Design-UI
- Android Material Design动画
- Android Material Design:PopupMenu
- android Material design
- Android Material Design详解
- Android Material Design theme
- android Material Design详解
- Android Material Design简介
- Android Material Design theme
- centos6.6 安装mysql5.7.14
- Day1
- 战斗场景制作之怪物的AI
- 第一篇博客,以后多多总结
- 关于直接声明变量时直接初始化为setInterval
- Material Design on Android
- 简单的日期呈现程序
- dubbo学习(一)
- CISSP笔记06
- 十大最流行PHP框架排名
- MySql(8)------mysql数据类型之字符串类型
- Non Absorbing DFA DP (ASC2A SGU201 ZOJ2337 ACdream1218 Gym100197A)
- 测试开发工程师需要具备的性格
- 规范之路 -line-height 的工作原理