今天是我们分享的关于 Material Design 的第五篇文章了,今天给大家简单分享 FloatingActionButton 和 Snackbar 这两个 Material Design 小控件用法,通过之前几篇博文的相关的对 Material Design 的介绍,大家对 Material Design 也有了一些了解,本篇我们来接着学习上面说到的两个简单的小控件,FloatingActionButton 其实就是我们看到的悬浮按钮,SnackBar 则是底部弹出的一个小型交互控件,接下来我们开始来演绎
一、悬浮按钮 FloatingActionButton
这里我们直接上 activity_main.xml 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#c7c6c6">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:titleTextColor="#f5f0f0" />
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="18dp"
android:elevation="20dp"
android:src="@mipmap/pen"
app:backgroundTint="#0882f4" />
</FrameLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="left"
app:headerLayout="@layout/navigation_head"
app:menu="@menu/navigation">
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
这里我们是接着上一篇的博文代码来敲的,相信看过上一篇的大家也很明白,不过没有看过的也不要紧,这里我们只是在主布局中增加了 FlaotingActionButton,即今天我们要实现的功能,这里需要注意的就是,FlaotingActionButton 按钮会默认使用 colorAccent 来作为按钮的颜色,如果要更改的话也可以通过 app:backgroundTint 属性来设置,这里我们通过 layout_gravity 把悬浮按钮设置到右下角,然后通过 layout_margin 属性给控件四周留点距离,最后通过 src 属性来设置了图标,就这么简单,我们就实现了,效果图如下:
这样悬浮按钮就在右下方出现了,仔细看会发现按钮下面还有阴影,这也是 Material Design 设计的风格体现,另外我们还可以通过 app:elevation 来指定一个高度值,高度值越大,投影范围也越大,高度值越小,投影范围也越小,投影的效果越浓,当然这些效果都不是特别的明显,接下来我们来看如何实现 FlaotingActionButton 的点击事件
MainActivity 中的代码如下:
public class MainActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
private NavigationView navigationView;
private FloatingActionButton floatingActionButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar);
setSupportActionBar(toolbar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
navigationView = (NavigationView) findViewById(R.id.navigation);
// FloatingActionButton 悬浮按钮
floatingActionButton = (FloatingActionButton) findViewById(R.id.fab);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.mipmap.category);
}
navigationView.setCheckedItem(R.id.account);
navigationItemSelected();
floatingActionButton();
}
private void navigationItemSelected() {
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
mDrawerLayout.closeDrawers();
//do something
return true;
}
});
}
/**
* FloatingActionButton 响应
*/
private void floatingActionButton() {
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "FloatingActionButton", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.backup:
Toast.makeText(this, "Click Backup", Toast.LENGTH_LONG).show();
break;
case R.id.delete:
Toast.makeText(this, "Click Delete", Toast.LENGTH_LONG).show();
break;
case R.id.setting:
Toast.makeText(this, "Click Setting", Toast.LENGTH_LONG).show();
break;
case android.R.id.home:
mDrawerLayout.openDrawer(Gravity.LEFT);
break;
default:
}
return true;
}
}
这里的代码也是挺清晰的,首先我们先初始化 FlaotingActionButton 控件,然后通过 setOnclickListener 来设置点击事件,这里是不是太熟悉了,是的,FlaotingActionButton 的点击事件的设置是和我们普通的 Button 一模一样,并没有什么特别之处,这里我们是点击按钮弹出一个吐司,大家可以根据业务的具体需要进行相应的功能实现
二、交互提示 Snackbar
上面我们已经掌握了 FlaotingActionButton 的基本用法,现在我们来学习 Material Design 的另一个小工具 Snackbar,这里首先要明确 Snackbar 并不是 Toast 的替代品,应用场景是不一样的,Toast 只是一个提示作用,用户并不能进行操作,而 Snackbar 则不同,它允许在提示当中加入一个交互按钮,当用户点击的时候可以进行一写相应额逻辑操作,相应的提升了用户体验
修改 Activity 中的代码如下:
/**
* FloatingActionButton 响应
*/
private void floatingActionButton() {
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(v, "data", Snackbar.LENGTH_SHORT).setAction("你好", new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something
Toast.makeText(MainActivity.this, "data", Toast.LENGTH_SHORT).show();
}
}).show();
}
});
}
我们来进行简单的分析,这里调用了 Snackbar 的 make() 方法来创建一个 Snackbar 对象,make() 方法的第一个参数要出入一个View,Snackbar 会使用这个 View 来自动查找最外层的布局,用于展示 Snackbar,第二个参数是 Snackbar 中显示的内容,第三个参数是显示 Snackbar 的时间长短,这里和 Toast 设置时间的长短类似,接着调用 setAction() 方法来设置一个动作,从而让 Snackbar 不仅仅是一个提示,而是可以和用户进行交互,这个是最重要的,效果图如下:
可以看到这里出现了一个不好的体验,就是 Snackbar 从底部弹出以后遮挡了 FlaotingActionButton 按钮,那么这个该如何解决呢,其实也很简单,就是通过 CoordinatorLayout 布局,我们具体来看一下,我们修改 activity_main.xml 中的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#c7c6c6">
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:titleTextColor="#f5f0f0" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="18dp"
android:elevation="20dp"
android:src="@mipmap/pen"
app:backgroundTint="#0882f4" />
</android.support.design.widget.CoordinatorLayout>
这里我们把 FrameLayout 换成了 CoordinatorLayout 布局,我们再运行来看一下效果图:
这里看到上面的问题就很好的解决了,是不是很神奇,CoordinatorLayout 其实就是一个加强版的 FrameLayout ,这个布局是由Material Design 库提供的,CoordinatorLayout 可以监听所有子控件的各种事件,然后做出最为合理的响应,例如我们刚才的使用,Snackbar 提示将悬浮按钮挡住了,而如果我们能够监听到 Sanckbar 的弹出事件,则把按钮向上偏移,从而确保 FlaotingActionButton不会被挡住,另外由于是加强版的 FrameLayout 大家可以放心使用,不会有任何的副作用,好了今天我们就介绍到这里,今天的内容不多,但确是一些实用的小技巧,希望大家可以掌握