Android kotlin CoordinatorLayout使用笔记(二)
Android kotlin CoordinatorLayout使用笔记(三)
Android kotlin CoordinatorLayout使用笔记(四)
前言
最近项目刚好要用到这个东西,就去搜了下用法,出来的文章一言难尽,基本上是抄来抄去,而且也不容易看懂,所以就自己来总结下使用
简介
CoordinatorLayout (协调布局)就是用来实现折叠效果的, 一般配合AppBarLayout和CollapsingToolbarLayout来用,常见的如外卖点餐页面,知乎页面等(就是上滑顶部菜单折叠变成别的布局)
使用
想要协调布局,首先要先套一层CoordinatorLayout (这个可以配合behavior来协调其他view的变化)
这里先简单演示下如何协调其他View,一个View跟随另一个View
这儿会使用到一个自定义View(DownMoveView):拖拽可移动的View,具体可以看这个:
自定义拖曳跟随手指移动View
这里会在CoordinatorLayout 里面使用2个View,一个DownMoveView,一个普通的view
让普通的View跟随着DownMoveView一块移动,并且位置在DownMoveView正下方100px
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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">
<com.example.rbq.DownMoveView
android:id="@+id/view1"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@mipmap/ic_launcher" />
<View
android:id="@+id/view2"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="120dp"
android:background="@drawable/ic_map_person"
app:layout_behavior=".MyBehavior"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
View1就是我们自定义的DownMoveView,View2则指定了一个behavior,这个就是实现跟随效果的behavior
class MyBehavior @JvmOverloads constructor(context: Context,
attrs: AttributeSet? = null) : CoordinatorLayout.Behavior<View>(context, attrs) {
/**
* 使用该Behavior的View要监听哪个类型的View的状态变化
* @param parent CoordinatorLayout
* @param child 使用该Behavior的View
* @param dependency dependency代表要监听的View
*/
override fun layoutDependsOn(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
//这儿我们要监听DownMoveView
return dependency is DownMoveView
}
/**
* 当被监听的View状态变化时会调用该方法
* 参数同上一个方法一致
* child -> View2
* dependency -> view1
* 使View2永远在View1下方100px位置
*/
override fun onDependentViewChanged(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
val view2Param = child.layoutParams as CoordinatorLayout.LayoutParams
view2Param.topMargin = dependency.top + dependency.height + 100
view2Param.leftMargin = dependency.left
child.layoutParams = view2Param
return true
}
}
结语
最基本的CoordinatorLayout就到这里了,下一遍会讲解进阶用法
网友评论