CoordinatorLayout

协调者:一般会是两个控件,一个Dependency一个child ,CoordinatorLayout的主要功能就是协调这两个控件,使child跟随Dependency的布局变化而变化(比如:位置,大小等)。其中变化的规则,则是由一个CoordinatorLayout.Behavior来决定。demo:

一:布局

<?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"
    android:orientation="vertical"
>     <com.kxl.mydemo.view.CoordinaterDependencyView
        android:id="@+id/coor_layout"
        android:layout_width="60dp"
        android:text="Dependency"
        android:textColor="#000000"
        android:layout_height="60dp"
        android:background="#55ff55"
/>     <Button
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:background="#ff5555"
        android:text="child"
        app:layout_behavior="com.kxl.mydemo.coordinator.MoveBehavior"
/> </android.support.design.widget.CoordinatorLayout>

二。自定义的一个,可移动的view:com.kxl.mydemo.view.CoordinaterDependencyView

import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
 * Created by kxl on 2016/10/18.
 */
public class CoordinaterDependencyView extends TextView {
    private  String TAG = "CoordinaterDependencyView";
    private int width;
    private int height;
    int lastx;
    int lasty;
    public CoordinaterDependencyView(Context context) {
        super(context);
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        int displaywidth =  displayMetrics.widthPixels;
        int displayheight =  displayMetrics.heightPixels;
        Log.i(TAG,"displaywidth:"+displaywidth+"  displayheight:"+displayheight);
    }
    public CoordinaterDependencyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        width = getMeasuredWidth();
        height = getMeasuredHeight();
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int)event.getRawX();
        int y = (int)event.getRawY();
        Log.i(TAG,"onTouchEvent x:"+x+"  y:"+y);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
                int nx = layoutParams.leftMargin+x-lastx;
                int ny = layoutParams.topMargin+y-lasty;
                layoutParams.leftMargin = nx;
                layoutParams.topMargin = ny;
                setLayoutParams(layoutParams);
                requestLayout();
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                break;
        }
        lastx = x;
        lasty = y;
        return true;
    }
}

三:协调规则。Behavior:

import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup; import com.kxl.mydemo.view.CoordinaterDependencyView;
http://www.90168.org/
/**
 * Created by kxl on 2016/10/18.
 */
public class MoveBehavior extends CoordinatorLayout.Behavior<View> {
    int  width;
    public MoveBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
        DisplayMetrics display = context.getResources().getDisplayMetrics();
        width  = display.widthPixels;
    }
    /**
     * @return 返回是否是child依赖的布局
     */
   
@Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return dependency instanceof CoordinaterDependencyView;
    }
    /**
     *  dependency控件有变化时,会调用这个方法
     */
   
@Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
        ViewGroup.MarginLayoutParams pa = (ViewGroup.MarginLayoutParams) child.getLayoutParams();
        pa.leftMargin = width  - dependency.getLeft();
        pa.topMargin =  dependency.getTop();
        child.setLayoutParams(pa);
        return true;
    }
}

VIew-CoordinatorLayout 笔记的更多相关文章

  1. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  2. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  3. Understanding Scroll Views 深入理解 scroll view 读书笔记

    Understanding Scroll Views 深入理解 scroll view  读书笔记   It may be hard to believe, but a UIScrollView is ...

  4. iphone/ipad关于size, frame and bounds总结和UIScroll view学习笔记

    1. iphone/ipad大小 Device Screen dimensions(in points) iphone and ipod 320 X 480 ipad 768 X 1024 2. UI ...

  5. (转)Qt Model/View 学习笔记 (六)——在views中选择数据项

    在views中选择数据项 概念 用于新的view类中的选择模型比Qt3中的模型有了很大的改进.它为基于model/view架构的选择提供了更为全面的描述.尽管对提供了的views来说,负责操纵选择的标 ...

  6. (转)Qt Model/View 学习笔记 (四)——创建新的Models

    创建新的Models 介绍 model/view组件之间功能的分离,允许创建model利用现成的views.这也可以使用标准的功能 图形用户接口组件像QListView,QTableView和QTre ...

  7. (转)Qt Model/View 学习笔记 (三)——Model类

    Model类 基本概念 在model/view构架中,model为view和delegates使用数据提供了标准接口.在Qt中,标准接口QAbstractItemModel类中被定义.不管数据在底层以 ...

  8. (转)Qt Model/View 学习笔记 (二)——Qt Model/View模式举例

    Qt Model/View模式举例 Qt提供了两个标准的models:QStandardItemModel和QDirModel.QStandardItemModel是一个多用途的model,可用于表示 ...

  9. (转)Qt Model/View 学习笔记 (一)——Qt Model/View模式简介

    Qt Model/View模式简介 Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的 功能上的分离给了开发人员更大的弹性来定制数据项 ...

  10. Android自定义View学习笔记(一)

    绘制基础 参考:HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础 Paint详解 参考:HenCoder Android 开发进阶: 自定义 View 1-2 Pain ...

随机推荐

  1. WCF 服务编程 - 常用绑定

    WCF  定义了5中常用的绑定. 一. 绑定 1.基本绑定: 对应于BasicHttpBinding类.基本绑定能够将WCF服务公开为传统的ASMX Web服务,使得原客户端能够与新的服务协作.如果客 ...

  2. Android 常用开发工具以及Mac常用软件

    Android 常用的开发工具记录.其中包括AndroidStudio(IDEA)插件.Mac 上好用的软件以及国内知名Android开发者博客等. Android Studio 插件 codota ...

  3. Rails sanitize

    The SanitizeHelper module provides a set of methods for scrubbing text of undesired HTML elements. T ...

  4. 微信小程序导航:官方工具+精品教程+DEMO集合(1月7更新)

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=14764346784612:简易教程:https://mp.weixin.qq.com/debug ...

  5. CapsLock与ctrl的键位修改

    windows下修改方式: linux下修改方式: 在用户目录下新建文档命名为keychange.sh 编辑以下内容: remove Lock = Caps_Lock remove Control = ...

  6. 《Linux常用命令》笔记

    ① ifconfig 查看IP状态; ② ls 查看当前路径文件信息,参数: -l 查看文件的详细信息与ll效果一样; -a 查看文件的全部信息; ③ man 查询当前指令的信息,查询可用字母q退出; ...

  7. Gulp真实项目用例

    包括了less预编译,css压缩,html文件include引入,js混淆压缩,本地开发热刷新服务器,html压缩,版本号添加 github地址: gulpfile.js var gulp = req ...

  8. JS客户端RSA加密,Java服务端解密

    常用语网页客户端对密码加密,在后端java解密还原 java代码依赖    <dependency>      <groupId>commons-codec</group ...

  9. Bootstrap 中的 Typeahead 组件 -- AutoComplete

    Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,功能很强大,但是,使用上并不太方便.这里我们将介绍一下这个组件的使用. 第一,简单使用 首先,最简单 ...

  10. C# IComparable接口、IComparer接口和CompareTo(Object x)方法、Compare()方法

    在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异.比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?重新实现IComparer接口 ...