首页 > 其他分享 >Android CoordinatorLayout使用示例记录

Android CoordinatorLayout使用示例记录

时间:2024-11-21 11:31:26浏览次数:1  
标签:示例 app title dependency child CoordinatorLayout Android View

原文链接: 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一定要是全类名,否则会出现崩溃问题!

参考

标签:示例,app,title,dependency,child,CoordinatorLayout,Android,View
From: https://www.cnblogs.com/stars-one/p/18543723

相关文章

  • Android core control目录下的作用
    在Android系统中,corecontrol的目录通常位于:/sys/module/core_ctl/parameters/该目录包含一系列文件,用于控制和调节Android的core_ctl模块的行为。core_ctl是专门为多核处理器设计的一种动态核心管理机制,尤其在big.LITTLE架构下,用于平衡性能和功耗。以下是该目录下......
  • android 拍照图片保存方法之二
    直接利用(Bitmap)extras.get("data")方法获得的图片是系统自动压缩过的缩略图,清晰图不够。这次介绍的方法是通过uri传递来保存图片。大概思路如下:在程序内部创建一个临时文件,利用临时文件的uri传递给响应事件获得原图,并且在一个imageview中显示出来,如果喜欢的话就重新命名......
  • LocalDateTime一些常用方法及示例
    packagecom.aaa.day04.api;importcom.aaa.utils.MyTool;importjava.time.*;importjava.time.format.DateTimeFormatter;importjava.util.Set;/***@author:nie6668888*@date:Createdin2024/11/1514:22*@description:*@modifiedBy:*@version:......
  • Android通过修改ELF实现注入
    Android通过修改ELF实现注入在实现外挂的过程中,是通过将外挂的模块进行注入到对应的游戏进程中去实现的,我们可以通过相同的原理去注入so,来实现so注入进程实现frida-gadget的注入首先是通过ELF文件的修改注入so+------------------------+|ELFHeader|文件头,描述......
  • WPF简单的数据绑定示例
    publicpartialclassindex:INotifyPropertyChanged{publicindex(){InitializeComponent();DataContext=this;}privatestring_userName;publicstringUserName{......
  • Android15音频进阶之提升进程优先级方案(九十五)
    简介:CSDN博客专家、《Android系统多媒体进阶实战》一书作者新书发布:《Android系统多媒体进阶实战》......
  • Windows系统在VSCode(Visual Studio Code)中使用.NET MAUI并且配置Android Emulator
    Windows系统在VSCode(VisualStudioCode)中使用.NETMAUI并且配置AndroidEmulatorVSCode优点极多,自主配置,界面舒适,如果不想使用VisualStudio来开发MAUI应用,并且不下载完整的AndroidStudio,仅使用其Emulator,以下是为VSCode配置环境的方法,同时解决了多种可能出现的问题。第......
  • android 使用MediaPlayer实现音乐播放
        Android 多媒体框架支持播放各种常见媒体类型,因此可轻松地将音频、视频和图片集成到您的应用中。你可以播放音频或从存储在应用资源(原始资源)的媒体文件(原始资源)中获取独立文件或从通过网络连接到达的数据流中,所有这些均使用 MediaPlayer API。1.MediaPlaye......
  • SMARTFORMS函数调用完整示例:打印工厂物料信息
    首先规划想要打印的效果和信息,这里示例的是想要打印物料数据库里面的信息。①对相关数据表创建表结构:SE11 注意数据类型,数量quan需要参考类型:创建表结构:②创建一个REPORT程序,并对相关的字段、变量、内表进行声明,并写一个SELECTION界面和一些基础的取数等,具体代码如下:DATA......
  • 达梦数据库迁移示例路径
    官方文档:https://eco.dameng.com/document/dm/zh-cn/faq/faq-db-changes.html博客:https://mp.weixin.qq.com/s/9ggRIiHdWz3LOIhfvS84mw迁移数据库实例路径迁移目标路径/usr/local/app/dmdbms/data/DAMENG/db-data/DAMENG步骤停止数据库服务进入达梦数据库......