CoordinatorLayout的最简入门

序言

本文力求用最短的篇幅,让读者明白CoordinatorLayout的用法。原理不作深入讨论。

CoordinatorLayout是什么

由Google加入Android系统的一个新的布局容器。相当于一个高级的FrameLayout。它通过Behavior的方式,使容器类的视图能够相互关联,协作,从而轻松地完成一些交互与动效。

CoordinatorLayout 如何接入

compile 'com.android.support:design:23.2.1'

根据自己的complie版本,修改到对应的版本即可。

CoordinatorLayout 如何使用

网上有很多文章结合xxxView,结合yyyView使用,仿佛<b>CoordinatorLayout</b>只能与部分结合使用,其实并非如此!那些奇奇怪怪的View,只是Android官方为我们写好的示例。

<b>CoordinatorLayout</b>的核心是协调,它能够协调任何View之间的动作和效果。它以Behavior类作为连接view的桥梁。

实例演示

需求:界面中有一个Button背景是绿色。点击它弹出一个Snackbar。当Snackbar完全弹出时,Button背景变为红色。当Snackbar准备离开时,Button背景再度变为绿色。

MyButtonBehavior

public class MyButtonBehavior extends CoordinatorLayout.Behavior<Button> {

    // 注意:如果没有这个构造方法,xml导入时将报错。
    public MyButtonBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, Button child, View dependency) {

        return dependency instanceof Snackbar.SnackbarLayout;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, Button child, View dependency) {
        if (dependency instanceof Snackbar.SnackbarLayout) {
            float y = ViewCompat.getTranslationY(dependency);
            if (y <= 5) {
                child.setBackgroundColor(0x44ff0000);
            } else {
                child.setBackgroundColor(0x4400ff00);
            }
        }
        return false;
    }
}

在这个例子中,我们最少需要MyButtonBehavior有三个方法。

  • parent 是 Button和Snackbar的容器
  • child 是Button
  • dependency 是Snackbar

因为在本例中,是Button的背景色依赖Snackbar的位置变化。

布局文件

<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">
    <Button
        android:id="@+id/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#4400ff00"
        app:layout_behavior=".MyButtonBehavior"/>
</android.support.design.widget.CoordinatorLayout>

Activity

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Snackbar.make(view, "Hello world", Snackbar.LENGTH_LONG)
                        .setAction("cancel", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {

                            }
                        })
                        .show();
            }
        });
    }
}

以上就完成了需求中的效果。通过CoordinatorLayout和Behavior,将过去复杂的页面回调封装了起来,使代码更加简洁,开发效率也提高很多。

以上。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏上善若水

011android初级篇之android登录界面的设计

登录框的自动提示功能参考一下链接中的AutoCompleteTextView的使用

1413
来自专栏GIS讲堂

Arcgis for Androd API开发系列教程(一)——地图显示与GPS定位

序:最近呢,工作鸭梨不是怎么大,对于自己爱折腾的想法又冒出了水面,开始自己的android开发的学习之旅。但是呢,本人是做GIS的,所以呢,就打算从这方面入手看...

875
来自专栏Android干货

关于安卓开发实现双状态按钮

2719
来自专栏三流程序员的挣扎

Navigation 详解二

BottomNavigationView 以更简洁的方式来实现过去的 BottomNavigationBar 的样式。Android Studio 中创建一个 ...

762
来自专栏小巫技术博客

A009-layout资源

本节课继续讲Android中的资源文件-layout资源,一个界面的诞生离不开布局,我们Android开发者的大部分工作都是在搭建UI,一个产品的诞生,首先是由...

833
来自专栏向治洪

Android网络请求框架之Retrofit实践

网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用go...

1778
来自专栏刘望舒

Android View体系(十一)自定义ViewGroup

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属...

2355
来自专栏Android机器圈

Android之Bmob移动后端云服务器

源码下载:http://download.csdn.net/download/jjhahage/10034519 PS:一般情况下,我们在写android程序的...

4609
来自专栏everhad

消息处理管道

TODO: 待写 消息处理管道 一个App看作是系统,外部输入消息需要经过一系列处理,涉及不同接收者。消息处理的跟踪(Trace)和结果的保存。 比如设计一个...

1866
来自专栏用户2442861的专栏

公司(视频 社交)项目分享

http://blog.csdn.net/u011733020/article/details/46786471

656

扫码关注云+社区