【Android compose原创组件】在Compose里面实现内容不满一屏也可以触发边界阻尼效果的一种可用方法

创意背景

在安卓 View 传统命令式开发里面提供了非常多稳定美观体验好的组件,但是目前Compose还未有可用的组件,比如View中可以使用 coordinatorlayout 的滚动效果可以实现局部(即使内容不满一屏也可以触发滚动边界阻尼效果),为了最小成本实现相同的效果,我们可以利用Column的滚动边界为基础间接实现类似效果。

在这里插入图片描述

代码和过程:

package lcppx.

import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp

// 默认垂直滚动的竖直布局,在元素不满屏幕的时候,也可以滚动边界动画
// 原理就是不满屏幕的时候,多加0.5px,就可以触发滚动边界动画
@Composable
fun ColumnScrollV(
    modifier: Modifier = Modifier,

    // 垂直滚动参数配置
    state: ScrollState = rememberScrollState(),
    enabled: Boolean = true,
    flingBehavior: FlingBehavior? = null,
    reverseScrolling: Boolean = false,
    // 内容
    content: @Composable() (ColumnScope.() -> Unit),
) {
    state.maxValue
    val isNotFull by remember { derivedStateOf { !state.canScrollForward && !state.canScrollBackward } }
    //println("ColumnScrollV滚动是否满屏测试:$isNotFull")
    BoxWithConstraints(modifier = modifier) {
        val maxH by remember { derivedStateOf { maxHeight } }
        // 如果不是满屏,就多加一个0.5像素,触发边界动画
        Column(
            modifier = Modifier.fillMaxWidth().height(maxHeight)
                // 设置垂直滚动,如果不满屏幕,内外两个列表都使用同一个滚动状态,确保一起滚动
                // 如果满屏,就使用两个不同的滚动状态,确保两个列表可以分开滚动(其实如果内部满屏可以滚动,就会屏蔽外部的滚动,所以此处只有设置不一样的状态即可)
                .verticalScroll(if (isNotFull)state else rememberScrollState()),
        ) {
            //val etr = 0.142.dp
            val etrPx = 0.51f// 触发边缘滚动的阈值是0.5像素,稍微大一些
            val etr = with(LocalDensity.current) { etrPx.toDp() }
            //println("当前px值测试:$etrPx")
            Column(
                modifier = Modifier.fillMaxWidth().height(maxH).verticalScroll(state)// 设置垂直滚动
                    //.background(Color.Magenta),
            ) {
                content()
            }
            //content()
            Box(modifier = Modifier.fillMaxWidth().height(etr)
                //.background(Color.Blue)
            )
        }
    }
}

/
// 预览测试
@Preview
@Composable
private fun ColumnScrollVPreview() {
    ColumnScrollV(
        content = {
            Column(modifier = Modifier.fillMaxWidth().height(50.dp).background(Color.Red)) {
                Text(text = "1")
                Text(text = "2")
                Text(text = "3")
            }
            Column(modifier = Modifier.fillMaxWidth().height(50.dp).background(Color.Yellow)) {
                Text(text = "1")
                Text(text = "2")
            }
        },
    )
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android笔记(三十六):封装一个Matrix从顶部/底部对齐的ImageView

背景 ImageView的scaleType默认显示图片是这样,但是有时候设计稿需求希望图片左右能紧贴着ImageView左右边缘,又不破坏图片的比例,用自带的matrix,centerCrop等都可以满足 但是都会造成图片的某些区域被裁剪了,如果设…

docker desktop运行rabittmq容器,控制台无法访问

docker desktop运行rabittmq容器,控制台无法访问 启动过程:…此处缺略,网上一大堆 原因 原因是在Docker上运行的RabbitMQ,默认情况下是没有启用管理插件和管理页面的 解决办法 使用命令 docker exec -it 容器id /bin/bash 进…

重拾CSS,前端样式精读-媒体查询

前言 本文收录于CSS系列文章中,欢迎阅读指正 说到媒体查询,大家首先想到的可能是有关响应式的知识点,除此之外,它还可以用于条件加载资源,字体大小,图像和视频的优化,用户界面调整等等方面&am…

使用 Grafana api 查询 Datasource 数据

一、使用grafana 的api 接口 官方API 二、生成Api key 点击 Administration -》Users and accss -》Service accounts 进入页面 点击Add service account 创建 service account 点击Add service account token 点击 Generate token , 就可以生成 api key 了 三、进入grafana…

uniapp luch-request 使用教程+响应对象创建

1. 介绍 luch-request 是一个基于 Promise 开发的 uni-app 跨平台、项目级别的请求库。它具有更小的体积、易用的 API 和方便简单的自定义能力。luch-request 支持请求和响应拦截、全局挂载、多个全局配置实例、自定义验证器、文件上传/下载、任务操作、自定义参数以及多拦截器…

革新人脸图片智能修复

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月16日20点46分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…

OpenGL ES 文字渲染方式有几种?

在音视频或 OpenGL 开发中,文字渲染是一个高频使用的功能,比如制作一些酷炫的字幕、为视频添加水印、设置特殊字体等等。 实际上 OpenGL 并没有定义渲染文字的方式,所以我们最能想到的办法是:将带有文字的图像上传到纹理,然后进行纹理贴图。 本文分别介绍下在应用层和 C+…

Javaweb-day12(登录认证)

登录功能 登录校验(重点) 登录校验指的是在服务器接收到浏览器发送过来的请求之后,首先要对这个请求进行校验,先要校验一下用户登录了没有 怎么来实现登录校验的操作呢?具体的实现思路可以分为两部分: 在…

DBeaver中PostgreSQL数据库显示不全的解决方法

本文介绍在DBeaver中,连接PostgreSQL后,数据库显示不全的解决方法。 最近,在DBeaver中连接了本地的PostgreSQL数据库。但是连接后打开这个数据库时发现,其所显示的Databases不全。如下图所示,Databases只显示了一个pos…

计算机视觉 1-8章 (硕士)

文章目录 零、前言1.先行课程:python、深度学习、数字图像处理2.查文献3.环境安装 第一章:概论1.计算机视觉的概念2.机器学习 第二章:图像处理相关基础1.图像的概念2.图像处理3.滤波器4.卷积神经网络CNN5.图像的多层表示:图像金字…

如何使用EasyExcel生成多列表组合填充的复杂Excel示例

作者:Funky_oaNiu 一、(需求)生成的表格效果:二、搞一个模板文件三、建立对应的表格实体类四、开始填充五、Vue3前端发起请求下载六、官方文档及AI问答 一、(需求)生成的表格效果: 其中只有顶部…

手机ip地址异常怎么解决

在现代社会中,手机已成为我们日常生活中不可或缺的一部分,无论是工作、学习还是娱乐,都离不开网络的支持。然而,有时我们会遇到手机IP地址异常的问题,这不仅会影响我们的网络体验,还可能带来安全隐患。本文…

Python酷库之旅-第三方库Pandas(218)

目录 一、用法精讲 1021、pandas.DatetimeIndex.inferred_freq属性 1021-1、语法 1021-2、参数 1021-3、功能 1021-4、返回值 1021-5、说明 1021-6、用法 1021-6-1、数据准备 1021-6-2、代码示例 1021-6-3、结果输出 1022、pandas.DatetimeIndex.indexer_at_time方…

基于 CentOS7.6 的 Docker 下载常用的容器(MySQLRedisMongoDB),解决拉取容器镜像失败问题

安装MySQL&Redis&MongoDB mysql选择是8版本,redis是选择4版本、mongoDB选择最新版,也可以根据自己的需要进行下载对应的版本,无非就是容器名:版本号 这样去拉去相关的容器镜像。如果你还不会在服务器中安装 docker,可以查…

讯飞、阿里云、腾讯云:Android 语音合成服务对比选择

在 移动端 接入语音合成方面,讯飞和腾讯云等都是优秀的选择,但各有其特点和优势。咱们的需求是需要支持普通话/英语/法语三种语言,以下是对各个平台的详细比较: 一、讯飞语音合成介绍 与语音听写相反,语音合成是将一段…

设计模式之责任链模式(Chain Of Responsibility)

一、责任链模式介绍 1、责任链模式介绍 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在 一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链 传递请求,直到有一个对…

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西,主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数(或 alloca)分配的是栈内存,它的特点是: 生命周…

更改liunx的磁盘名称

目录 1. 问题的提出 2. 机器环境说明 3. 解决方法 1. 问题的提出 今天在Linux上部署软件,发现要部署软件的硬盘名称带中文,当访问该磁盘时,中文则被转为长长的一串数字字符串,这很不方便,于是需要将带有中文的磁盘名…

基于Python 和 pyecharts 制作招聘数据可视化分析大屏

在本教程中,我们将展示如何使用 Python 和 pyecharts 库,通过对招聘数据的分析,制作一个交互式的招聘数据分析大屏。此大屏将通过不同类型的图表(如柱状图、饼图、词云图等)展示招聘行业、职位要求、薪资分布等信息。 …

论文PDF页面无法下载PDF

问题:通常在下载学术论文时,网页命名是PDF页面,但是无法下载PDF,下载的是html网页 解决: mac:按F12打开开发者界面 然后点击源代码/来源选项 然后打开下图所在位置,鼠标右键复制链接&#xff…