0
点赞
收藏
分享

微信扫一扫

听说谷歌Baba更新了 Material UI ...


LZ-Says:确实,大佬的背后永不缺乏对技术的坚韧,对技术的热衷,致敬~

前言 - LZ瞎比比

听说谷歌Baba更新了Material-UI?记忆不乏飘散到前几年。。。

我是一枚不折不扣的Android开发者,14年9月到现在,可谓现在才有了一点点资格入Android大门。还记得我曾羡慕IOS端的UI样式,那简易流畅的使用方式,让我一次次的默默的吐槽谷歌Baba,干哈呢?

直到,当谷歌Baba在14年推出Android 5.0,其中变包含Material Design,这个不得不让人大快人心的良心之作。奈何,LZ却是在17年的某天才有所了解,不得不佩服自己所谓的敏锐性以及对前沿技术的关注乏之又乏。

后期看着网上玲琅满目的各种对Material Design的解说,我也疑惑了,是简单的使用?还是整理一份自己的简单的专属Material Design的博文?最终,还是决定,自己亲自撸一波~

要问过程爽不爽,只有撸过才知道。来吧,伸出你的左右手,让我们一起撸一波谷歌Baba这次又为我们更新了哪儿些让人惊喜的玩意~


听说谷歌Baba更新了 Material UI ..._android

来来来,撸之前,先了解了解

简单来回顾下:

Material Design,是谷歌在14年的IO大会上提出的一种新的理念,也被称为新的设计语言(也被称为“原材料设计”),称它为设计语言不为过,但是实际上,这仅仅是谷歌提倡的一种新的设计风格、理念以及设计基本原则。

初衷,是一种新的设计语言。而推出之后,也没看到几家真正应用到,之前看到《薄荷》这款产品,用张哥的话说,充满了Material Design元素,良心产品,良心张哥,666~

有兴趣的小伙伴可以点击下方的链接地址查看,自行体验体验:

​​http://www.boohee.com/​​

而今,查看官方,发现这次似乎又新增了666的东西,如下图所示:


听说谷歌Baba更新了 Material UI ..._android_02

不仅仅是我大Android,另外新添加了IOS、Web以及Flutter三大巨头。当然咯,本文的侧重点在于Android模块,其他的部分大家感兴趣的话可在文末自行了解。

这里聊点题外话

这里不得不吐槽一下,现在的软件啊,越来越特么的不要脸了,举个例子,软件本身功能就是查看文件目录,你说你特么的要定位,获取联系人,获取IMEI、IMSI,MAC等权限干叼?

也是够够的了,真希望未来的谷歌Baba可以针对这种无良厂商做出一定限制,最基本的,做好自己本职工作,别管什么原因,少涉及非应用本身的内容。

祝愿~!!!加油,看好你哦~

脑图展示


听说谷歌Baba更新了 Material UI ..._Android_03

嘀嘀嘀,开车了

时间不早了,得赶紧开车咯,不然熬成小老头更找不到对象咯~

坐标:帝都,单身小姐姐看过来哦~ 贴心懂事会照顾人,一枚标准可爱会害羞猿猿~

PS:突然感到得到我鸡排大大部分真传~

一、初始化配置

首先,要保证当前Android Studio

Step 1: 打开工程目录下的build.gradle文件,并添加maven引用

allprojects {
repositories {
google()
jcenter()
// 1.添加Google Maven地址
maven {
url "https://maven.google.com"
}
}
}

Step 2: 修改编译版本

// 2.修改编译版本为 android - P
compileSdkVersion 'android-P'

Step 3: 移除项目工程中依赖的v7包以及添加material依赖

dependencies {
// 3.移除项目工程中依赖的v7包
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
// 4.添加material依赖
implementation 'com.google.android.material:material:1.0.0-alpha1'
}

当然,你可以使用com.android.support:design:28.0.0-alpha1,但是主要注意的是design包和material二者只能选一。

Step 4: 使用:androidx.appcompat.app.AppCompatActivity

注意:使用的是androidx

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

同步一下,运行一波,虽然毛也没。。。好歹不报错~

二、玩转Material - UI

1. Bottom App Bar

Material Design的一个重要特征是设计 BottomAppBar。可适应用户不断变化的需求和行为,So,BottomAppBar是一个从标准物质指导的演变。它更注重功能,增加参与度,并可视化地锚定UI。

先来一个什么鬼样式都没有的:

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

<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:backgroundTint="@color/colorPrimaryDark" // 设置背景色
app:navigationIcon="@android:drawable/ic_menu_call" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_anchor="@id/bar" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

效果当然比较low咯!


听说谷歌Baba更新了 Material UI ..._Material UI_04

下面引用一个官方内置样式:

  • style=”@style/Widget.MaterialComponents.BottomAppBar”:

当然下面还有一些其他的属性:

  • 可以通过FabAlignmentMode,FabAttached,FabCradleMargin,FabCradleRoundedCornerRadius和FabCradleVerticalOffset来控制FAB的放置;
  • (FabAlignmentMode)可以设置为中心或结束。如果FabAttached设置为True,那么Fab将被布置为连接到BottomAppBar;
  • FabCradleMargin是设置FAB和BottomAppBar之间的间距,改变这个值会增加或减少FAB和BottomAppBar之间的间距;
  • FabCradleRoundedCornerRadius指定切口周围角的圆度;
  • FabCradleVerticalOffset指定FAB和BottomAppBar之间的垂直偏移量。如果fabCradleVerticalOffset为0,则FAB的中心将与BottomAppBar的顶部对齐。

当然,我们还可以通过fabAttached属性去设置FloatingActionButton以及BottomAppBar是否粘合,效果如下:

  • app:fabAttached=”false”:
  • app:fabAttached=”true”:
2. Bottom Navigation

BottomNavigationView创建底部导航栏,用户只需轻点一下即可轻松浏览和切换顶级内容视图。

当项目有3到5个顶层(底部)目的地导航到时,可以使用此模式。

使用也是很Easy,如下:

  1. 创建一个菜单资源 ,最多5个导航目标(BottomNavigationView不支持超过5个项目);
  2. 在内容下面放置BottomNavigationView;
  3. 将BottomNavigationView上的app:menu属性设置为菜单资源;
  4. 设置选择监听事件setOnNavigationItemSelectedListener(…)。

那下面按照步骤操作一次:

Step 1: 在布局中添加BottomNavigationView:

<com.google.android.material.bottomnavigation.BottomNavigationView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@color/colorPrimaryDark"
app:menu="@menu/bottom_navigation_menu" />

Step 2: 定义menu

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item
android:icon="@android:drawable/ic_menu_info_details"
android:orderInCategory="100"
android:title="你" />
<item
android:icon="@android:drawable/ic_menu_info_details"
android:orderInCategory="100"
android:title="我" />
<item
android:icon="@android:drawable/ic_menu_help"
android:orderInCategory="100"
android:title="他" />

</menu>

Step 3: 运行一波,走起~


听说谷歌Baba更新了 Material UI ..._Material Design_05

Step 4: 通过app:itemIconTint和app:itemTextColor设置响应用户点击状态。包括Icon以及字体颜色

1.定义bottom_navigation_colors

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorAccent" android:state_checked="true" />
<item android:color="@android:color/white" android:state_checked="false" />
</selector>

2.添加引用

app:itemIconTint="@drawable/bottom_navigation_colors"
app:itemTextColor="@drawable/bottom_navigation_colors"

3.查看效果


听说谷歌Baba更新了 Material UI ..._Material UI_06

下面简单依次列出使用系统内置样式效果:

  • style=”@style/Widget.Design.BottomNavigationView”

默认的材质BottomNavigationView样式由更新的颜色,文字大小和行为组成。默认的BottomNavigationView具有白色背景以及带有颜色的图标和文本colorPrimary。

  • 演示效果如下:


听说谷歌Baba更新了 Material UI ..._Material UI_07

  • style=”@style/Widget.MaterialComponents.BottomNavigationView.Colored”:

此样式继承默认样式,但将颜色设置为不同的属性。 使用彩色样式获取带有colorPrimary背景的底部导航栏,并为图标和文本颜色添加白色阴影。

  • 演示效果如下:


听说谷歌Baba更新了 Material UI ..._xml_08

  • style=”@style/Widget.Design.BottomNavigationView”:

如果希望底部导航栏具有旧行为,可以在BottomNavigationView上设置此样式。 但是,还是建议尽可能使用更新后的Material style。

  • 演示效果如下:


听说谷歌Baba更新了 Material UI ..._android_09

3. Bottom Sheets

BottomSheetBehavior应用于CoordinatorLayout的一个子类, 使其成为持久的底部工作表。

持久性底部页面是从屏幕底部出现的视图,在主要内容上升高。他们可以垂直拖动以暴露他们的内容列表。

注意:如果要使用模态(对话框)的底页,请使用 BottomSheetDialogFragment。

下面着撸起实现:

Step 1: 搞个布局玩玩

外层使用CoordinatorLayout包裹,底部导航栏采用BottomNavigationView,中间内容区域,很Easy咯~

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cl_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<com.google.android.material.button.MaterialButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:onClick="showBehavior"
android:text="测试" />

<androidx.core.widget.NestedScrollView
android:id="@+id/show_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:behavior_hideable="true"
app:behavior_peekHeight="300dp"
app:behavior_skipCollapsed="true"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="300dp"
app:cardBackgroundColor="@color/colorAccent" />

<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="300dp"
app:cardBackgroundColor="@color/colorPrimaryDark" />

<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="300dp"
app:cardBackgroundColor="@color/colorAccent" />

</LinearLayout>
</androidx.core.widget.NestedScrollView>

<com.google.android.material.bottomnavigation.BottomNavigationView
style="@style/Widget.Design.BottomNavigationView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@color/colorPrimaryDark"
app:menu="@menu/bottom_navigation_menu" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Step 2: 实现效果,主要是BottomSheetBehavior使用

package com.hlq.materialstudy;

import android.os.Bundle;
import android.view.View;

import com.google.android.material.bottomsheet.BottomSheetBehavior;

import androidx.appcompat.app.AppCompatActivity;
import androidx.coordinatorlayout.widget.CoordinatorLayout;

public class MainActivity extends AppCompatActivity {

private CoordinatorLayout mCoordinatorLayout;
BottomSheetBehavior behavior;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCoordinatorLayout = findViewById(R.id.cl_layout);
View bottomSheetView = mCoordinatorLayout.findViewById(R.id.show_list);
behavior = BottomSheetBehavior.from(bottomSheetView);
behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(View view, int i) {
// 这里是bottomSheet 状态的改变,根据slideOffset可以做一些动画
}

@Override
public void onSlide(View view, float v) {
// 这里是拖拽中的回调,根据slideOffset可以做一些动画
}
});
}

public void showBehavior(View view) {
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}

}

Step 3: 效果如下


听说谷歌Baba更新了 Material UI ..._Material UI_10

俩步走,666没毛病。

这里再次简单描述相关细节:

Bottom Sheets具有五种状态:

  • STATE_COLLAPSED: Bottom Sheets是可见的,但只显示可视(部分)高度。此状态通常是底部工作表的“静止位置”。可视高度由开发人员选择,应足以表明有额外的内容,允许用户触发某个动作或扩展Bottom Sheets;
  • STATE_EXPANDED: Bottom Sheets是可见的并且它的最大高度并且不是拖拽或沉降;
  • STATE_DRAGGING:用户主动向上或向下拖动Bottom Sheets;
  • STATE_SETTLING: 拖动/轻扫手势后,Bottom Sheets将调整到特定高度。这将是可视高度,展开高度或0,以防用户操作导致底部表单隐藏;
  • STATE_HIDDEN: Bottom Sheets隐藏。

如果已经在Activity使用CoordinatorLayout,添加底部表单很简单:

  1. 将任何视图添加为CoordinatorLayout的直接子视图。
  2. 通过添加以下xml属性来应用该行为 app:layout_behavior=”com.google.android.material.bottomsheet.BottomSheetBehavior”
  3. 设置所需的行为标志
  • app:behavior_hideable:是否可以通过拖拽隐藏底部表单。
  • app:behavior_peekHeight:折叠状态的窥视高度。
  • app:behavior_skipCollapsed:如果底部表单可隐藏,并且设置为true,则表单不会处于折叠状态。
4. Chips

Chip代表一个小块中的复杂实体,如联系人。 它是一个圆形按钮,由一个标签,一个可选的芯片图标和一个可选的关闭图标组成。 如果Chip可检查,则可以点击或切换Chip。

Chip可以被放置在ChipGroup中,其可以被配置为将其Chip布置在单个水平线中或者重新排列在多个线上。如果一个ChipGroup包含可检查的Chip,那么它也可以控制其一组Chip是否单选。

也可以在需要Drawable的上下文中直接使用独立的ChipDrawable。
例如,启用自动完成的文本字段可以使用跨度将ChipDrawable替换为text,以将其表示为语义实体。

上面啰嗦半天,还是来点实际的干货,怎么玩?

扔个布局:

<com.google.android.material.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:chipText="渣渣贺" />

看个效果:


听说谷歌Baba更新了 Material UI ..._Material Design_11

丢几个内置样式:

  • style=”@style/Widget.MaterialComponents.Chip.Entry”:
    注意: Chip通常与独立的ChipDrawable一起使用。
  • style=”@style/Widget.MaterialComponents.Chip.Filter”:
    注意:Filter Chip通常放置在一个ChipGroup。
  • style=”@style/Widget.MaterialComponents.Chip.Choice”:
    注意:Filter Chip通常放置在一个ChipGroup。
  • style=”@style/Widget.MaterialComponents.Chip.Action”:

快到最后时,甩出来点其他属性:


听说谷歌Baba更新了 Material UI ..._android_12

处理点击事件也是很easy,这里直接放上官方提供demo:

  • Call setOnClickListener(OnClickListener) to register a callback to be invoked when the chip is clicked.

Chip chip = (Chip) findViewById(R.id.chip);

chip.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// Handle the click.
}
});

  • Or, call setOnCheckedChangeListener(OnCheckedChangeListener) to register a callback to be invoked when the chip is toggled.

Chip chip = (Chip) findViewById(R.id.chip);

chip.setOnCheckedChangeListener(new setOnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton view, boolean isChecked) {
// Handle the toggle.
}
});

  • Call setOnCloseIconClickListener(OnClickListener) to register a callback to be invoked when the chip’s close icon is clicked.

Chip chip = (Chip) findViewById(R.id.chip);

chip.setOnCloseIconClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// Handle the click on the close icon.
}
});

而下面说说关于ChipGroup的使用:

ChipGroup默认会在多条线路上重排Chip。

<com.google.android.material.chip.ChipGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">

<!-- Chips can be declared here, or added dynamically. -->

</com.google.android.material.chip.ChipGroup>

当然,也可以使用该app:singleLine属性将其限制在单个水平线上 。如果这样做,通常会使用HorizontalScrollView来包装 ChipGroup。

<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.chip.ChipGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:singleLine="true">

<!-- Chips can be declared here, or added dynamically. -->

</com.google.android.material.chip.ChipGroup>
</HorizontalScrollView>

当让,ChipGroup可以通过app:singleSelection设置单选,但是需要注意以下俩点:

  • 为ChipGroup设置:app:singleSelection=”true”
  • 为Chip设置:style=”@style/Widget.MaterialComponents.Chip.Choice”

而效果如下:


听说谷歌Baba更新了 Material UI ..._android_13

有的小伙伴说了,那么我怎么处理选中的Chip项呢?这里简单贴出官方提供的小例子:

ChipGroup chipGroup = (ChipGroup) findViewById(R.id.chip_group);

chipGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(ChipGroup group, @IdRes int checkedId) {
// Handle the checked chip change.
}
});

那么如何使用一个独立的ChipDrawable呢?

独立ChipDrawable可以用在需要一个的Drawable环境中。最明显的用例是联系人。大概如下图所示的样子:


听说谷歌Baba更新了 Material UI ..._Material UI_14

使用ChipDrawable时,首先要在res目录下创建xml目录,并定义一个Chip文件,如下。

<chip xmlns:app="http://schemas.android.com/apk/res-auto"
app:chipIcon="@mipmap/ic_launcher_round"
app:chipText="渣渣贺" />

在Activity中引用资源,赋值:

// Inflate from resources.
ChipDrawable chip = ChipDrawable.createFromResource(this, R.xml.standalone_chip);
// Use it as a Drawable however you want.
chip.setBounds(0, 0, chip.getIntrinsicWidth(), chip.getIntrinsicHeight());
ImageSpan span = new ImageSpan(chip);
EditText editText=findViewById(R.id.edit_text);
Editable text = editText.getText();
text.setSpan(span, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果如下:


听说谷歌Baba更新了 Material UI ..._android_15

当然,Entry Chip是独立ChipDrawables 的默认Material风格,但我们可以使用style属性应用任何其他样式,并且,所有属性Chip都可以应用于ChipDrawable资源。

5. Collapsing Toolbars

首先附上一张官方效果图:


听说谷歌Baba更新了 Material UI ..._Material Design_16

CollapsingToolbarLayout是ViewGroup为material准则中指定的折叠工具栏提供许多视觉特征和交互。CollapsingToolbarLayout 集成了 AppBarLayout, CoordinatorLayout, Toolbar,和滚动内容视图,如 RecyclerView。所以如果你有药创建的折叠式toolbar时,这个当然是不二其选。

而用法也是很easy:

  • 要将Collapsing Toolbar添加到布局,并且将AppBarLayout内部放置到一个CollapsingToolbarLayout;
  • 添加一个Toolbar和任何其他视图作为一个子项的CollapsingToolbarLayout。确保整个视图结构位于内部CoordinatorLayout以利用CollapsingToolbarLayout滚动和功能。

下面简单来撸一个效果:

放置布局:

<androidx.coordinatorlayout.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">

<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="300dp">

<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/collapsingtoolbarlayout"
android:layout_width="match_parent"
android:layout_height="300dp"
app:contentScrim="#ee22ff"
app:expandedTitleMarginStart="10dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">

<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
android:background="@drawable/test"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.7" />

<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>

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

</androidx.coordinatorlayout.widget.CoordinatorLayout>

实例化:

mToolbarLayout = findViewById(R.id.collapsingtoolbarlayout);
mToolbarLayout.setTitle("渣渣贺");
RecyclerView showList = findViewById(R.id.showList);
showList.setLayoutManager(new LinearLayoutManager(this));
showList.setAdapter(new ShowAdapter(getListData()));

看个效果:


听说谷歌Baba更新了 Material UI ..._xml_17

6. Floating Action Button

FloatingActionButton在应用程序中显示主要操作。这是一个圆形图标按钮,要高于其他页面内容。

而使用起来也是很简单Easy,具体详情可以查看之前LZ写过的有关Material Design文章,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_margin="15dp"
app:srcCompat="@android:drawable/ic_menu_add" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

展示效果如下:


听说谷歌Baba更新了 Material UI ..._android_18

默认显示左上角,可以通过layout_gravity去设置显示位置。

当然咯,贴心的谷歌为我们内置了样式,一起来看一下吧~

  • style=”@style/Widget.Design.FloatingActionButton”:

当然咯,还有其他一些属性,如下:


听说谷歌Baba更新了 Material UI ..._xml_19

而设置事件也如同我们之前的View一样,下面直接官方盗图:


听说谷歌Baba更新了 Material UI ..._Material UI_20

7. Material Button

Material Button是具有更新视觉样式的可自定义按钮组件,且内部内置了多种样式。

而使用起来也是很方便,如下:

<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="演示按钮" />

显示效果如下:


听说谷歌Baba更新了 Material UI ..._xml_21

当我们设置android:enabled=”false”时,显示如下效果:


听说谷歌Baba更新了 Material UI ..._xml_22

使用系统内置样式效果一览:

  • style=”@style/Widget.MaterialComponents.Button”效果如下:
  • style=”@style/Widget.MaterialComponents.Button.TextButton”效果如下:
  • style=”@style/Widget.MaterialComponents.Button.UnelevatedButton”效果如下:

当然除了这些,谷歌还为我们准备了其他的一些属性,如下表:


听说谷歌Baba更新了 Material UI ..._Material UI_23

8. Material Card

MaterialCardView是基于CardView Android支持库的可自定义组件 。MaterialCardView提供了CardView所有功能,并添加了用于自定义描边的属性,并默认使用更新的材质样式。

下面附上一个简单例子:

<com.google.android.material.card.MaterialCardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="@dimen/mtrl_card_spacing"
app:strokeColor="@color/colorPrimaryDark" // 设置边框颜色
app:strokeWidth="3dp"> // 设置边框宽度

<ImageView
android:layout_width="200dp"
android:layout_height="150dp"
android:scaleType="fitXY"
android:src="@mipmap/ic_launcher" />

</com.google.android.material.card.MaterialCardView>

效果如下:


听说谷歌Baba更新了 Material UI ..._android_24

当然,系统为我们提供了Material Style效果,使用时只需要新增如下即可:

style="@style/Widget.MaterialComponents.CardView"

效果嘛,没看出有毛的不一样,这里不放图了~

9. Modal Bottom Sheet

BottomSheetDialogFragment是常规支持库Fragment顶部的一个薄层,呈现效果类似底部表单,当然也可充当对话框。

Modal bottom sheets会在它们下面的内容上产生阴影,本质上是对话框。 如果点击对话框外的内容,则底部表单将被解除。 可以垂直拖动Modal bottom sheets,并完全将其滑下。

10. Navigation View

NavigationView是从显示导航菜单的最简单方法。

通常与DrawerLayout结合使用以实现Material navigation drawers。 导航抽屉是用户从屏幕边缘/左侧的模式打开类似对话框,用于显示应用内导航链接。

具有属性如下:

  • app:menu: 指向将呈现的菜单资源的NavigationView
  • app:headerLayout: 指向一个将布局资源作为头部使用的NavigationView

当然通过setNavigationItemSelectedListener监听导航栏,去知晓用户触发具体菜单并链接到应有的业务逻辑上。

下面简单来例子:

<androidx.drawerlayout.widget.DrawerLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Your content goes here -->
</androidx.coordinatorlayout.widget.CoordinatorLayout>

<com.google.android.material.navigation.NavigationView
android:id="@+id/navigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start|left"
app:headerLayout="@layout/item_layout"
app:menu="@menu/bottom_navigation_menu" />
</androidx.drawerlayout.widget.DrawerLayout>

效果如下:


听说谷歌Baba更新了 Material UI ..._Material UI_25

11. Snackbar

Snackbar,这个就不解释了,Android 5.0推出效果就包含,感觉没啥特别的。

public void showSnakeBar(View view) {
Snackbar.make(view, "这是一个测试样例", Snackbar.LENGTH_LONG)
.setAction("确认", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
}
}).show();
}

演示图如下:


听说谷歌Baba更新了 Material UI ..._Material Design_26

12. Tab Layout

TabLayout提供了一个水平布局来显示选项卡。 该布局处理一组选项卡的交互,其中包括:

  • scrolling behavior:滚动
  • (swipe) gestures:(轻扫)手势
  • tab selection:标签选择
  • animations:动画
  • alignment:对齐

下面先来简单操练一番:

<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.google.android.material.tabs.TabItem
android:icon="@android:drawable/ic_menu_add"
android:text="添加" />

<com.google.android.material.tabs.TabItem
android:icon="@android:drawable/ic_menu_call"
android:text="拨打电话" />

<com.google.android.material.tabs.TabItem
android:icon="@android:drawable/ic_menu_camera"
android:text="来个自拍" />

</com.google.android.material.tabs.TabLayout>

效果也是很nice:


听说谷歌Baba更新了 Material UI ..._Android_27

有的小伙伴说,忒丑了。。。

正好,谷歌Baba提供了几个内置样式,一起来看看吧~

  • style=”@style/Widget.MaterialComponents.TabLayout”

效果如下:


听说谷歌Baba更新了 Material UI ..._Material Design_28

  • style=”@style/Widget.MaterialComponents.TabLayout.Colored”:

效果如下:


听说谷歌Baba更新了 Material UI ..._xml_29

  • style=”@style/Widget.Design.TabLayout”:

效果如下:


听说谷歌Baba更新了 Material UI ..._Android_30

其次,选项卡布局应该在与相应选项卡关联的内容上方使用,并让用户在内容视图之间快速切换。 这些内容视图通常保存在ViewPager中。

使用setupWithViewPager(ViewPager)将TabLayout与ViewPager链接起来。 TabLayout中的各个选项卡将自动填充PagerAdapter的页面标题。

ViewPager pager;
TabLayout tabs = (TabLayout) findViewById(R.id.tabs);

tabs.setupWithViewPager(pager);

当然也可以将TabLayoutXML 添加到ViewPager中:

<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.google.android.material.tabs.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top" />

</android.support.v4.view.ViewPager>

当然,其中还包含其他的一些属性,如下:


听说谷歌Baba更新了 Material UI ..._android_31

13. Text Fields

TextInputLayout,一个基于Material text fields实现的nice控件。当它与TextInputEditText配合使用时,会为我们增添许多的惊喜。

而下面,我们简单撸一波~

<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名" />

</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码" />

</com.google.android.material.textfield.TextInputLayout>

使用很easy,而效果又如何呢?


听说谷歌Baba更新了 Material UI ..._Material Design_32

下面放一波关于系统内置样式效果:

  • style=”@style/Widget.MaterialComponents.TextInputLayout.FilledBox”:
  • style=”@style/Widget.MaterialComponents.TextInputLayout.OutlineBox”:
  • style=”@style/Widget.MaterialComponents.TextInputLayout.FilledBox.Dense”:
  • style=”@style/Widget.MaterialComponents.TextInputLayout.OutlineBox.Dense”:

当然,如果你觉得不够用,可以使用下图中的属性去设置Padding和Radiu:


听说谷歌Baba更新了 Material UI ..._xml_33

其次,也可以使用下图中内置的属性去玩转其他的一些效果:


听说谷歌Baba更新了 Material UI ..._android_34

14. Top App Bar

AppBarLayout是一个ViewGroup,最常用于包装一个Toolbar,则这里也包含了很多Material Design效果以及交互。

这里截取一张官方说明图,大家简单了解下:


听说谷歌Baba更新了 Material UI ..._android_35

当然,具体详情可直接查看官方地址,下面附上链接:

​​https://material.io/design/components/app-bars-top.html#anatomy​​

开撸过程中遇到的小问题

这里记录下LZ撸码过程中遇到的问题,希望各位老铁避免LZ这睿智的问题~

1. error: resource android:attr/dialogCornerRadius not found

问题原因:

依赖关系与当前编译环境不匹配。

问题解决地址:

​​https://stackoverflow.com/questions/49280632/error9-5-error-resource-androidattr-dialogcornerradius-not-found​​

2.android.support.v4.app.INotificationSideChannelStub S t u b Proxy

问题原因:

依赖项不兼容,查看配置。LZ这里由于compileSdkVersion版本以及配置异常导致。

问题解决地址:

​​https://stackoverflow.com/questions/50289355/google-material-design-library-error-program-type-already-present-android-suppo​​

参考资料

  1. ​​官方基本配置以及注意事项​​;
  2. ​​官方开发文档​​;
  3. ​​官方GitHub地址​​;
  4. ​​官方 API Class​​;
  5. ​​BottomSheets的使用​​;

个人公众号

不定期发布博文,欢迎关注~


听说谷歌Baba更新了 Material UI ..._android_36


举报

相关推荐

0 条评论