高级UI-自定义Behavior
Behavior本身是一个抽象类,可以用于两个view之间的状态监听,也可用于某个view监听CoordinateLayout里面的所有控件滑动状态,实现自定义Behavior则可以实现任意两个view之间的状态变化
简单使用
这里我们自定义一个Behavior,继承自CoordinatorLayout.Behavior,实现观察者随着被观察者的位置改变而变动
需要重写layoutDependsOn()和onDependentViewChanged()两个方法,注意:这里的构造方法必须写上
public class CustomBehavior extends Behavior<View> {
public CustomBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 建立监听控件或容器依赖
*
* @param parent 父容器
* @param child 观察者,监听其他
* @param dependency 被观察者
* @return
*/
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
//我们这里监听的是一个TextView
return dependency instanceof TextView
|| super.layoutDependsOn(parent, child, dependency);
}
/**
* 被监听的View改变时,相应的处理
*
* @param parent
* @param child
* @param dependency
* @return
*/
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
//获取被监听View的状态改变,这里以位置改变为例
//偏移量
int topOffset = dependency.getTop() - child.getTop();
int width = parent.getContext().getResources().getDisplayMetrics().widthPixels;
int leftOffset = dependency.getLeft() - (width - child.getRight());
//平移
ViewCompat.offsetTopAndBottom(child, topOffset);
ViewCompat.offsetLeftAndRight(child, -leftOffset);
return super.onDependentViewChanged(parent, child, dependency);
}
}
记住这里依旧需要导入依赖
implementation 'com.android.support:design:25.4.0'
然后编写主要布局,这里的两个TextView,一个为观察者,一个为被观察者
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text_view"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="left|top"
android:background="@android:color/holo_orange_light"
android:gravity="center"
android:text="被观察者" />
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="right|top"
android:background="@android:color/holo_green_light"
android:gravity="center"
android:text="观察者"
app:layout_behavior=".CustomBehavior" />
</android.support.design.widget.CoordinatorLayout>
在活动中实现touch方法,使得被观察者可以被拖动
public class MainActivity extends AppCompatActivity implements View.OnTouchListener{
private static final String TAG = "MainActivity";
private TextView textView;
private int rawX;
private int rawY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text_view);
textView.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
case R.id.text_view:
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
rawX = (int) event.getRawX();
rawY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int x = (int) event.getRawX();
int y = (int) event.getRawY();
int dx = x - rawX;
int dy = y - rawY;
int l = textView.getLeft();
int r = textView.getRight();
int t = textView.getTop();
int b = textView.getBottom();
textView.layout(l + dx, t + dy, r + dx, b + dy);
rawX = (int) event.getRawX();
rawY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
}
break;
}
return true;
}
}
实现效果如下图

同时可以有多个观察者
实现滑动状态的监听
需要重写onStartNestedScroll()和onNestedScroll()方法,在观察者上做好标记
具体可参见《高级UI之FloatingActionButton》一文
高级UI-自定义Behavior的更多相关文章
- firefox 扩展开发笔记(三):高级ui交互编程
firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...
- Android 高级UI设计笔记07:RecyclerView 的详解
1. 使用RecyclerView 在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...
- 重要的ui组件——Behavior
v7包下的组件类似CoordinatorLayout推出也有一段时间了,大家使用的时候应该会体会到其中很多的便利,今天这篇文章带大家来了解一个比较重要的ui组件——Behavior.从字面意思上就可以 ...
- 自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页
使用CoordinatorLayout打造各种炫酷的效果 自定义Behavior -- 仿知乎,FloatActionButton隐藏与展示 NestedScrolling 机制深入解析 一步步带你读 ...
- 原生HTML5 input type=file按钮UI自定义
原生<input type="file" name="file" />长得太丑 提升一下颜值 实现方案一.设置input[type=file]透明度 ...
- 大数据技术之_09_Flume学习_Flume概述+Flume快速入门+Flume企业开发案例+Flume监控之Ganglia+Flume高级之自定义MySQLSource+Flume企业真实面试题(重点)
第1章 Flume概述1.1 Flume定义1.2 Flume组成架构1.2.1 Agent1.2.2 Source1.2.3 Channel1.2.4 Sink1.2.5 Event1.3 Flum ...
- 自定义Behavior 实现Listbox自动滚动到选中项
原文:自定义Behavior 实现Listbox自动滚动到选中项 blend为我们提供方便的behavior来扩展我们的控件,写好之后就可以在blend中方便的使用了. 下面是自定义的behavior ...
- Nginx 高级配置-自定义json格式日志
Nginx 高级配置-自定义json格式日志 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在大数据运维工作中,我们经常会使用flume,filebeat相关日志收集工具取收集日志 ...
- Customize the Application UI and Behavior 自定义应用程序UI和行为
In XAF, the business model defines the database structure and UI appearance. Changes to your persist ...
随机推荐
- cube.js 学习(七)cube.js type 以及format 说明
cube.js 对于measure以及dimension 提供了丰富的数据类型,基本满足我们常见应用的开发,同时对于不同类型也提供了 格式化的操作 measure类型 number 格式 purc ...
- Ubuntu 系统安装ssh的命令
更新源列表 打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"-- ...
- [HAOI2015][bzoj 4033]树上染色(树dp+复杂度分析)
[题目描述]有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两 ...
- 洛谷 P1230 智力大冲浪 题解
P1230 智力大冲浪 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者 \(m\)元.先不要太高兴!因为这些钱还不一定都是你的 ...
- python中的zip函数的使用
>>> x = [, , ] >>> y = [, , ] >>> z = [, , ] >>> xyz = list(zip( ...
- laravel 通过ftp上传的时候报错 Use of undefined constant FTP_BINARY - assumed 'FTP_BINARY
用Laravel中的filesystems里面的ftp上传文件时报错.在windows上开发,文件上传的时候碰到上面的问题,搜了些资料,发现是php7的ftp拓展默认未开启. filesystems是 ...
- 阿里云配置WAF的步骤
date:2019-07-04 17:59:19 author: headsen chen 配置WAF防护策略 本页目录 操作步骤 网站接入Web应用防火墙(WAF)后,WAF以默认防护策略为其过滤 ...
- 如何改为root用户 并挂载
改为root用户才能挂载,使用的命令是sudo su,换成自己就su + 名字就好了,比如bnrc. 进入root之后,执行命令mount /dev/sdb/ /diskb/,即mount + 使用的 ...
- Vue-cli项目结构讲解
|-- build // 项目构建(webpack)相关代码 | |-- build.js // 生产环境构建代码 | |-- check-version.js // 检查node.npm等版本 | ...
- ISO/IEC 9899:2011 条款6.5.1——基本表达式
6.5.1 基本表达式 语法 1.primary-expression: identifier constant string-literal ( expression ) generic ...