枕上诗书闲处好,门前风景雨来佳。这篇文章主要讲述Android CoordinatorLayout 入门介绍相关的知识,希望能为你提供帮助。
android CoordinatorLayout 入门介绍
-
- CoordinatorLayout
- View 知道如何表现
在
2015
年的
I/O
开发者大会上,Google
介绍了一个新的
Android Design Support Library
,该库可以帮助开发者在应用上使用
meterial design
。它包含了许多重要的
meterial design
的构建块,并且它支持
API 7
及以上的版本。如果你错过了这次大会,那就请打开谷歌开发者站点来查阅它的相关信息吧:传送门。CoordinatorLayout在库中所有好的东东之间,看起来真正有趣的是
CoordinatorLayout
,它是一个
FrameLayout
。从它的名字中,你或许已经猜到:该布局的强大在于,能够协调子元素之间的依赖关系。你需要做的就是把
View
包含在
CoordinatorLayout
中。让我们直接进入代码吧。下面的例子非常简单,它包含了
Floating Action Button
,点击时会触发一个
Snackbar
。首先,在
gradle
文件中引入
meterial design
库:compile \'com.android.support:design:22.2.0\'
接下来,为
Activity
创建一个简单的布局文件:< ?xml version="1.0" encoding="utf-8"?> < android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> < 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="https://www.songbingjia.com/android/@drawable/ic_done" /> < /android.support.design.widget.CoordinatorLayout>
还需要添加
MainActivity
:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Hello Snackbar", Snackbar.LENGTH_LONG).show(); } }); } }
效果显示
文章图片
非常酷,是吗?
但是,如果你想使用其它
FAB
的实现又会怎么样呢?因为
Support Library
中的
FAB
实现没有菜单选项,于是,我们尝试一下由开发者
Base
实现的
FAB
开源库。compile \'com.getbase:floatingactionbutton:1.9.1\'
< ?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:layout_width="match_parent" android:layout_height="match_parent"> < com.getbase.floatingactionbutton.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="16dp" app:fab_icon="@drawable/ic_done" /> < /android.support.design.widget.CoordinatorLayout>
开源库效果显示
文章图片
如图所示,在这种情况下,
CoordinatorLayout
不能正常工作。这是因为
View
没有默认的CoordinatorLayout.Behavior
的实现。现有的解决方案就是等待有人来完善它。或者呢,我们可以为这个组件写一个自定义的行为实现。:D
View 知道如何表现这个框架真的非常强大,要给
view
自定义行为时,你根本不需要获取这个
view
。你还可以改变任意
view
的默认行为。首先,需要继承
Behavior
类:public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<
FloatingActionButton>
为了使这个类可以填充
xml
中的内容,我们需要给它设置一个构造方法,方法有两个参数:Context
和AttributeSet
。public FloatingActionButtonBehavior(Context context, AttributeSet attrs) {}
接下来的步骤是重写
layoutDependsOn()
方法,并且,如果我们想监听改变,就让方法返回
true
。在例子中,我们只想监听
Snackbar
对象的改变。@Override public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { return dependency instanceof SnackbarLayout; }
现在,让我们继承真正行为的实现。当
CoordinatorLayout
中的
view
每次发生变化时,onDependentViewChanged
方法都会被调用。在这个方法中,我们要读取当前
Snackbar
的状态。当Snackbar
显示的时候,我们想把
FAB
也移上来。要实现这样的目的,我们需要把
FAB
的
Y
坐标设置为Snackbar
的高度。要得到正确的转换值,我们需要从转化的
Y
值中减去
Snackbar
的高度。@Override public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) { float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight()); child.setTranslationY(translationY); return true; }
最后一步就是告诉
CoordinatorLayout
使用
FloatingActionButtonBeahvior
:< ?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:layout_width="match_parent" android:layout_height="match_parent"> < com.getbase.floatingactionbutton.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="16dp" app:layout_behavior="com.getbase.coordinatorlayoutdemo.FloatingActionButtonBehavior" app:fab_icon="@drawable/ic_done" /> < /android.support.design.widget.CoordinatorLayout>
最终,问题被修正了:
问题修正后的效果显示
文章图片
如果你想为
view
定义默认行为,只需要在你的
Behavior
类上添加
DefaultBehavior
注解就可以了。以上代码的
GitHub
地址为:https://github.com/ggajews/coordinatorlayoutwithfabdemo
。祝大家编码愉快!
推荐阅读
- 3.Android 优化布局(解决TextView布局)
- Android消息机--handler的自我总结
- [lua]安卓ndk如何编译lua库
- Android Activity学习笔记
- Android学习笔记--使用Apache HttpClient实现网络下载效果,附带进度条显示
- Android学习笔记--使用HttpURLConnection实现网络下载效果,附带进度条显示
- android 安卓异步加载网络图片,与viewpager结合使用示例
- android构建者(Builder)模式使用方法详解
- Android Studio 2.2 External Build