尊重劳动成果,转载请注明出处:http://blog.csdn.net/growth58/article/details/48754869
关注新浪微博:@于卫国
邮箱:yuweiguocn@gmail.com

Google在2015 I/O大会上公布了Material Design Support Library,使用它可以创建materail应用在API 19以下突然变得很容易。在这个系列中,我们将使用RSS阅读器应用,我们用于Material系列的基础应用,重写让它完全使用新的Design Support Library。在这篇文章中我们将添加一个Floating Action Button or FAB

在开始之前值得注意的是这个应用根本不需要一个FAB 因为这没有动作可执行。然而,为了展示目前添加一个FAB 有多么容易,我从Douglas Adams获得一点灵感:

“Arthur Dent:如果我按下这个按钮会发生什么?
Ford Prefect:我不知道。
Arthur Dent:Oh.
Ford Prefect:发生了什么?
Arthur Dent:亮起一个标志,说‘请不要再按这个按钮’。”
——Douglas Adams, The Original Hitchhiker Radio Scripts

因此我们将会添加一个FAB,当按下时弹出一个Snackbar 说“请不要再按这个按钮” 。

首先我们需要添加一个FloatingActionButton 到我们布局文件:

res/layout/include_main.xml

<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  android:id="@+id/main_layout"  android:layout_width="match_parent"  android:layout_height="match_parent">  <android.support.design.widget.AppBarLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">    <android.support.v7.widget.Toolbar      android:id="@+id/toolbar"      android:layout_width="match_parent"      android:layout_height="?attr/actionBarSize"      app:layout_scrollFlags="scroll|enterAlways" />    <android.support.design.widget.TabLayout      android:id="@+id/tab_layout"      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:clipToPadding="false"      android:paddingLeft="@dimen/home_offset"      app:tabMode="scrollable" />  </android.support.design.widget.AppBarLayout>  <android.support.v4.view.ViewPager    android:id="@+id/viewpager"    android:layout_width="match_parent"    android:layout_height="match_parent"    app:layout_behavior="@string/appbar_scrolling_view_behavior" />  <android.support.design.widget.FloatingActionButton    android:id="@+id/fab"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="end|bottom"    android:layout_margin="16dp"    android:src="@drawable/ic_block" /></android.support.design.widget.CoordinatorLayout>

做其它事情之前,我们先看一下效果:

Oh noes!我们的FAB是白色的并且看起来相当丑陋。还记得在我们的TabLayout 中我们遇到 indicator bar 的颜色的问题,我们设置了它为白色来匹配文字?你猜怎么着?accent 颜色同样被用来FAB 的颜色。然而它很容易被修复,让我们使用accent 颜色让它在这两种情况都能工作:

res/values/colors.xml

<resources>  <color name="sa_green">#1E9618</color>  <color name="sa_green_dark">#146310</color>  <color name="sa_green_transparent">#201E9618</color>  <color name="sa_accent">#4EE147</color></resources>

res/values/styles.xml

<resources><!-- Base application theme. --><style name="AppTheme" parent="Base.AppTheme" /><style name="Base.AppTheme" parent="Theme.AppCompat.Light.NoActionBar">  <item name="colorPrimary">@color/sa_green</item>  <item name="colorPrimaryDark">@color/sa_green_dark</item>  <item name="colorAccent">@color/sa_accent</item>  <item name="colorControlHighlight">@color/sa_green_transparent</item></style></resources>

这样看起来还不错:

剩下就是在我们的Activity中写上OnClickListener :

public class MainActivity extends AppCompatActivity implements ArticlesConsumer {    private static final String DATA_FRAGMENT_TAG = DataFragment.class.getCanonicalName();    private static final int MENU_GROUP = 0;    private DrawerLayout drawerLayout;    private NavigationView navigationView;    private ViewPager viewPager;    private TabLayout tabLayout;    private FloatingActionButton fab;    private Articles articles;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);        navigationView = (NavigationView) findViewById(R.id.nav_view);        viewPager = (ViewPager) findViewById(R.id.viewpager);        tabLayout = (TabLayout) findViewById(R.id.tab_layout);        fab = (FloatingActionButton) findViewById(R.id.fab);        setupToolbar();        setupNavigationView();        setupDataFragment();        setupFab();    }    private void setupFab() {        fab.setOnClickListener(                new View.OnClickListener() {                    @Override                    public void onClick(View v) {                        Snackbar.make(v, R.string.fab_press, Snackbar.LENGTH_LONG).show();                    }                });    }}

现在我们可以尝试看一下效果:

注意到FAB是怎样随着Snackbar向上移动的吗?我们没有做任何事情获取这个行为,所以发生了什么?它是我们的朋友CoordinatorLayout 又一次在后台做的处理。

Snackbar 被创建时我们通过参考一个View ——在这种情况下它是FAB 生成onClick()调用。Snackbar 查看这个View 的父布局,如果它发现一个CoordinatorLayout 并且用CoordinatorLayout 注册了它的行为。FloatingActionButton 也用CoordinatorLayout 注册了它自己的行为,它依赖于Snackbar 的行为,当Snackbar 进出时CoordinatorLayout 会传递相关的信息。它甚至是很智能的,在大屏幕上Snackbar 不会拉伸至全宽,它不会移动FAB 因为不需要。

相当整洁,并且我们不需要做任何事情!

为了证明CoordinatorLayout 的执行逻辑,简单地通过CoordinatorLayout 之外的View 调用Snackbar.make()方法,你会看到这个漂亮的行为停止了。

这有一个真的需要提及的问题。如果你在Android 4.x 设备上运行这个代码FAB 的渲染相当难看的:

这有一个很简单的变通办法,在布局文件中添加app:borderWidth=”0dp” 属性到FloatingActionButton ,一切看起来都好了:

这个解决办法来自于 Chris Banes via Sebastiano Poggi 因此我猜测它将会在未来的design support library版本中被修复。多亏了Seb & Chris 提供给我如此简单的变通办法。

随着这个最后的问题,所有的示例图片和视频已经完成从Lollipop 设备上并且我们期待一个完全material 体验,但是怎么做才能很好地运行在旧版本的Android设备上呢?在下一篇文章我们将学习关于向后兼容的技巧。

源代码可以从这下载。

请我喝杯咖啡,请使用支付宝扫描下方二维码:

原文地址:https://blog.stylingandroid.com/design-library-part-4/

更多相关文章

  1. Android(安卓)播放本地视频
  2. Android学习笔记之相对布局与表格布局
  3. android gridview点击子选项动态改变item背景颜色
  4. 仿苹果弹性布局
  5. Android(安卓)自定义View学习(十一)——ViewGroup测量知识学习
  6. ViewPage第三课自定义viewpage
  7. android 两种按钮的动画效果
  8. 说说 Android(安卓)的 Material Design 设计(四)——卡片式布局
  9. [置顶] 【SwipeRefreshLayout】Google官方下拉刷新组件

随机推荐

  1. Android(安卓)必须知道2018年流行的框架
  2. 打开Android Studio报错,Unable to create
  3. android 读取DDMS里的文件时打不开,解决方
  4. 修改ProgressBar的进度条颜色
  5. android 禁止横屏时输入法全屏
  6. android 使用xml定义自己的View
  7. android 页面布局时定义控件ID时@id/XX和
  8. Android Application Fundamentals——An
  9. Android中字体的处理
  10. Android Studio 配置快捷方式生成JNI头文