Android CoordinatorLayout运用示例记载
原文链接: Android CoordinatorLayout运用示例记载-Stars-One的杂货小窝
简略记载下常用CoordinatorLayout的几个作用代码示例,便利后续有需求的时分参照完成
开端之前,注意下项目material 版别,下文说到的某些特点是在后续版别才有的
implementation("com.google.android.material:material:1.9.0")
一级吸顶作用
作用:
代码:
<?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">
<com.google.android.material.appbar.AppBarLayout
app:elevation="0dp"
android:background="#00000000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:textColor="@color/white"
android:background="#2BDC70"
android:gravity="center"
android:textSize="32sp"
android:text="翻滚后会躲藏"
app:layout_scrollFlags="scroll|snap"/>
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:textColor="@color/white"
android:background="#FD2E54"
android:gravity="center"
android:textSize="32sp"
android:text="固定头部"
/>
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:text="其他内容"
android:gravity="center_horizontal"
android:textColor="@color/white"
android:textSize="38sp"
android:layout_height="700dp"
android:background="#4A8A9E"/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
翻滚弹性显现标题
作用:
代码:
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:collapsedTitleGravity="start"
app:contentScrim="#ff0000"
app:expandedTitleTextColor="#00000000"
app:collapsedTitleTextColor="@color/white"
app:expandedTitleGravity="left|bottom"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:toolbarId="@+id/toolbar">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="240dp"
android:orientation="vertical"
app:layout_collapseMode="parallax">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/img" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="当时版别: "
android:textColor="#FFFFFF" />
</LinearLayout>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="50dp"
app:title="关于"
app:titleTextColor="#00000000"
app:layout_collapseMode="pin" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:id="@+id/rv_demo1_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="700dp"
android:background="#D88343"
android:gravity="center"
android:textColor="#ffffff"
android:text="这是一个翻滚布局"
android:textSize="20sp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
layout_behavior
特点设置尽管引证的string,但实践上这个string便是一个全类名!
CollapsingToolbarLayout特点弥补
特点名 | 描绘 |
---|---|
app:contentScrim | CollapsingToolbarLayout彻底折叠后的布景色彩 |
app:titleEnabled | 是否显现标题 |
app:title | 标题 |
app:toolbarId | toolbar 对应的view id |
app:statusBarScrim | 折叠后状况栏的布景 |
app:scrimVisibleHeightTrigger | 设置收起多少高度时,显现ContentScrim的内容 |
app:scrimAnimationDuration | 打开状况和折叠状况之间,内容转化的动画时刻 |
app:expandedTitleTextAppearance | 布局打开的时分title的款式 |
app:expandedTitleMarginTop | 布局打开的时分title的margin top |
app:expandedTitleMarginStart | 布局打开的时分title的margin start |
app:expandedTitleMarginEnd | 布局打开的时分title的margin end |
app:expandedTitleMarginBottom | 布局打开的时分title的margin bottom |
app:expandedTitleMargin | 布局打开的时分title的margin |
app:expandedTitleGravity | 布局打开的时分title的方位 |
app:collapsedTitleTextAppearance | 布局折叠的时分title的款式 |
app:collapsedTitleGravity | 布局折叠的时分title的gravity |
app:expandedTitleTextColor | 布局打开的时分title的色彩 |
app:collapsedTitleTextColor | 布局折叠时分title的色彩 |
翻滚躲藏底部菜单
这儿运用了自定义的behavior来完成
Behavior行为控制器:完成了用户能够在子视图上进行的一个或多个交互。这些交互或许包含拖动,滑动,甩动或任何其他手势。
Behavior中常用的重写的办法:
/**
* 确认运用Behavior的View要依靠的View的类型
* 只要是CoordinatorLayout内的View的状况发送了改动,该办法就会履行
* @param parent 顶层父控件CoordinatorLayout
* @param child 咱们设置这个Behavior的View
* @param dependency 值会不断的改动,他会轮询CoordinatorLayout下一切所属的子View
* @return 这儿判别dependency所属的View是哪一个, 回来true,onDependentViewChanged才履行,不然不履行
*/
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency)
/**
* 当被依靠的View状况改动时回调
* @param parent 顶层父控件CoordinatorLayout
* @param child 咱们设置这个Behavior的View
* @param dependency 值会不断的改动,他会轮询CoordinatorLayout下一切所属的子View
* @return 当咱们改动了child的巨细或许方位的时分咱们需求回来true
*/
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency)
/**
* 当被依靠的View移除时回调
* @param parent 顶层父控件CoordinatorLayout
* @param child 咱们设置这个Behavior的View
* @param dependency 值会不断的改动,他会轮询CoordinatorLayout下一切所属的子View
*/
@Override
public void onDependentViewRemoved(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency)
作用(向上滑动时底部控件逐渐躲藏,向下滑动时底部控件逐渐显现):
代码:
package zhan.scollzoomlistview.activity
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.View
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior
import com.google.android.material.appbar.AppBarLayout
import kotlin.math.abs
class MyBehavior: CoordinatorLayout.Behavior<View> {
constructor() : super()
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
override fun layoutDependsOn(
parent: CoordinatorLayout,
child: View,
dependency: View
): Boolean {
//这儿判别dependency所属的View是哪一个,回来true,onDependentViewChanged才履行,不然不履行
return dependency is AppBarLayout;
}
override fun onDependentViewChanged(
parent: CoordinatorLayout,
child: View,
dependency: View
): Boolean {
/*
*这儿获取dependency的top值,也便是AppBarLayout的top,由于AppBarLayout
*在是向上滚出界面的,咱们的由于是和AppBarLayout相反,每次都取反
*/
Log.d("ttt", "onDependentViewChanged: ${dependency.top}")
val myY = -dependency.top
child.translationY = myY.toFloat()
return true
}
}
解说下:
屏幕坐标以左上角为原点,y正方向为向下,而咱们手指向上滑动,实践AppBarLayout也在向上翻滚(仅仅屏幕不显现了)
AppBarLayout的top便是y,而初始方位top为0,然后其向上翻滚,这个时分的appbarlayout实践top间隔现已变为负数了
而咱们要修正底部菜单的translationY,实践便是相当于原始方位的y坐标偏移
- 假如 translationY 设置为 50,那么视图的制作方位会相对于它的原始方位向下平移 50 像素。
- 假如 translationY 设置为 -50,那么视图的制作方位会向上平移 50 像素。
所以:
- 底部菜单设置正数的translationY,完成的作用便是它向下移动到消失
- 底部菜单设置负数的translationY,完成的作用便是它向上移动到显现
<?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">
<com.google.android.material.appbar.AppBarLayout
app:elevation="0dp"
android:background="#00000000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:textColor="@color/white"
android:background="#2BDC70"
android:gravity="center"
android:textSize="32sp"
android:text="翻滚后会躲藏"
app:layout_scrollFlags="scroll|snap"/>
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:textColor="@color/white"
android:background="#FD2E54"
android:gravity="center"
android:textSize="32sp"
android:text="固定头部"
/>
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:text="其他内容"
android:gravity="center_horizontal"
android:textColor="@color/white"
android:textSize="38sp"
android:layout_height="700dp"
android:background="#4A8A9E"/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<!-- 底部菜单,简略写个布局来做比如 -->
<LinearLayout
android:layout_gravity="bottom"
app:layout_behavior="zhan.scollzoomlistview.activity.MyBehavior"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#5AC3E7"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="模仿底部菜单"/>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
底部菜单的layout_behavior必定要是全类名,不然会呈现溃散问题!
参阅
- 根据AppBarLayout完成二级吸顶&踩坑记载 - 知乎
- Android CoordinatorLayout运用 - 掘金