Jetpack Compose 从入门到入门(九)

2023-05-16

本篇是Compose的手势部分。

点击

添加clickable修饰符就可以轻松实现元素的点击。此外它还提供无障碍功能,并在点按时显示水波纹效果。

@Composable
fun ClickableSample() {
    val count = remember { mutableStateOf(0) }
    // content that you want to make clickable
    Text(
        text = count.value.toString(),
        modifier = Modifier.clickable { count.value += 1 }
    )
}

在这里插入图片描述

如果你想去除水波纹,可以将indication设为null。

@Composable
fun ClickableSample() {
    val count = remember { mutableStateOf(0) }
    Text(
        text = count.value.toString(),
        modifier = Modifier.clickable(
            indication = null,
            interactionSource = remember { MutableInteractionSource() }
        ) {
            count.value += 1
        },
    )
}

还可以使用pointerInput修饰符,它是没有水波纹效果的。同时它也支持各种手势检测。

Modifier.pointerInput(Unit) {
    detectTapGestures(
        onPress = { /* Called when the gesture starts */ },
        onDoubleTap = { /* Called on Double Tap */ },
        onLongPress = { /* Called on Long Press */ },
        onTap = { /* Called on Tap */ }
    )
}

滚动

滚动修饰符

添加verticalScrollhorizontalScroll 修饰符,可让用户在元素内容边界大于最大尺寸约束时滚动元素。

@Composable
fun ScrollBoxes() {
    Column(
        modifier = Modifier
            .background(Color.LightGray)
            .size(100.dp)
            .verticalScroll(rememberScrollState())
    ) {
        repeat(10) {
            Text("Item $it", modifier = Modifier.padding(2.dp))
        }
    }
}

上面的示例代码中,Column高度为100dp,里面有十个Text垂直方向排列。因为添加了verticalScroll,这个时候就可以垂直方向滚动了。

在这里插入图片描述

verticalScroll修饰符中会传入rememberScrollState()。它是ScrollState类型,通过它可以更改滚动位置或着获取当前状态。

@Composable
private fun ScrollBoxesSmooth() {

    // 初始滚动100px
    val state = rememberScrollState()
    LaunchedEffect(Unit) { state.animateScrollTo(100) }

    Column(
        modifier = Modifier
            .background(Color.LightGray)
            .size(100.dp)
            .verticalScroll(state)
    ) {
        repeat(10) {
            Text("Item $it", modifier = Modifier.padding(2.dp))
        }
    }
}

可滚动的修饰符

可滚动的修饰符scrollable 与滚动修饰符区别在于scrollable可检测滚动手势,但不会偏移其内容。所以它实际是添加了一个滚动的监听,并不是真正的让元素滚动。

以下代码可检测手势并显示偏移量的数值,但不会偏移任何元素:

@Composable
fun ScrollableSample() {
    // actual composable state
    var offset by remember { mutableStateOf(0f) }
    Box(
        Modifier
            .size(150.dp)
            .scrollable(
                orientation = Orientation.Vertical,
                // Scrollable state: describes how to consume
                // scrolling delta and update offset
                state = rememberScrollableState { delta ->
                    offset += delta
                    delta
                }
            )
            .background(Color.LightGray),
        contentAlignment = Alignment.Center
    ) {
        Text(offset.toString())
    }
}

在这里插入图片描述

嵌套滚动

简单的嵌套滚动无需您执行任何操作。滚动操作的手势会自动从子级传播到父级,这样一来,当子级无法进一步滚动时,手势就会由其父元素处理。

直接看文档的demo:

val gradient = Brush.verticalGradient(0f to Color.Gray, 1000f to Color.White)
Box(
    modifier = Modifier
        .background(Color.LightGray)
        .verticalScroll(rememberScrollState())
        .padding(32.dp)
) {
    Column {
        repeat(6) {
            Box(
                modifier = Modifier
                    .height(128.dp)
                    .verticalScroll(rememberScrollState())
            ) {
                Text(
                    "Scroll here",
                    modifier = Modifier
                        .border(12.dp, Color.DarkGray)
                        .background(brush = gradient)
                        .padding(24.dp)
                        .height(150.dp)
                )
            }
        }
    }
}

在这里插入图片描述

如果需要在多个元素之间创建高级协调滚动,可以使用nestedScroll修饰符定义嵌套滚动层次结构来提高灵活性。

fun Modifier.nestedScroll(
    connection: NestedScrollConnection,
    dispatcher: NestedScrollDispatcher? = null
): Modifier
  • connection:当子view滚动时接收事件。
  • dispatcher:分发嵌套滚动,用来通知父View中子View的消耗,可选参数。

NestedScrollConnection有四个回调方法,也代表着四个不同的阶段。

  • fun onPreScroll(available: Offset, source: NestedScrollSource): Offset = Offset.Zero,子View将要滚动时会触发此回调,返回值是需要消耗的滚动值,默认是0不消耗。available是将要滚动的值,source是滚动事件的来源,比如拖动,抛掷(Fling)。
  • fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset = Offset.Zero,当子View已经消耗后触发此回调。consumed是层次结构下所有嵌套滚动节点所消费的数量。available是可用增量。
  • suspend fun onPreFling(available: Velocity): Velocity = Velocity.Zero,停止拖动后,会以一定的速度滚动时触发。这个回调允许父View消耗部分速度。
  • suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity = Velocity.Zero,当子View完成了滑动的消耗,会触发此回调。这里你可以继续消耗滑动速度。

NestedScrollDispatcher下有四个调用方法,对应触发NestedScrollConnection的四个回调方法。

  • dispatchPreScroll -> onPreScroll
  • dispatchPostScroll -> onPostScroll
  • dispatchPreFling -> onPreFling
  • dispatchPostFling -> onPostFling

示例代码,可以看nestedscroll文档,这里就不详细说明了。

拖动

draggable 修饰符可以实现单一方向拖动手势,并且会返回拖动距离(以像素为单位)。

请务必注意,此修饰符与 scrollable 类似,仅检测手势。实际的元素移动需要通过 offset 修饰符处理。

var offsetX by remember { mutableStateOf(0f) }
Text(
    modifier = Modifier
        .offset { IntOffset(offsetX.roundToInt(), 0) }
        .draggable(
            orientation = Orientation.Horizontal,
            state = rememberDraggableState { delta ->
                offsetX += delta
            }
        ),
    text = "Drag me!"
)

注意单一方向这个限制,上面的示例代码中只能实现Text的左右移动。

如果需要控制整个拖动手势,请考虑改为通过 pointerInput 修饰符的拖动手势检测器。

Box(modifier = Modifier.fillMaxSize()) {
    var offsetX by remember { mutableStateOf(0f) }
    var offsetY by remember { mutableStateOf(0f) }

    Box(
        Modifier
            .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
            .background(Color.Blue)
            .size(50.dp)
            .pointerInput(Unit) {
                detectDragGestures { change, dragAmount ->
                    change.consumeAllChanges()
                    offsetX += dragAmount.x
                    offsetY += dragAmount.y
                }
            }
    )
}

在这里插入图片描述

滑动

使用 swipeable修饰符滑动元素。释放后,这些元素会朝一个方向定义的两个或多个锚点呈现动画效果。其常见用途是实现“滑动关闭”模式。

请务必注意,此修饰符不会移动元素,而只检测手势。实际的元素移动需要通过 offset 修饰符处理。

@Composable
fun SwipeableSample() {
    val width = 96.dp
    val squareSize = 48.dp

    val swipeableState = rememberSwipeableState(0)
    val sizePx = with(LocalDensity.current) { squareSize.toPx() }
    val anchors = mapOf(0f to 0, sizePx to 1) // Maps anchor points (in px) to states

    Box(
        modifier = Modifier
            .width(width)
            .swipeable(
                state = swipeableState,
                anchors = anchors,
                thresholds = { _, _ -> FractionalThreshold(0.3f) },
                orientation = Orientation.Horizontal
            )
            .background(Color.LightGray)
    ) {
        Box(
            Modifier
                .offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }
                .size(squareSize)
                .background(Color.DarkGray)
        )
    }
}

在这里插入图片描述

解释一下示例代码:

  • state:滑动状态,通过rememberSwipeableState()创建。可以获得当前的偏移量,滑动到指定位置等。
  • anchors:锚点。代码中0f为起始位置,sizePx为终点位置。当然也可以设置多个锚点,实现分段滑动。
  • orientation:滑动方向。
  • thresholds:指定状态之间阈值的位置。阈值将用于确定滑动停止时动画的状态。FractionalThreshold(0.3f)表示在锚点之间,滑动距离小于30%会自动滑回到锚点的初始位置。大于30%会自动滑回到锚点结束位置。

除了上面的属性,还可以配置滑动越过边界时的resistance阻力。
还有 velocityThreshold,比如滑动的30%是20dp,如果你设置velocityThreshold是5dp,那么滑动距离大于5dp时也可以触发动画向下一个状态滑动。

多点触控:平移、缩放、旋转

如需检测用于平移、缩放和旋转的多点触控手势,可以使用transformable修饰符。此修饰符本身不会转换元素,只会检测手势。

@Composable
fun TransformableSample() {
    // set up all transformation states
    var scale by remember { mutableStateOf(1f) }
    var rotation by remember { mutableStateOf(0f) }
    var offset by remember { mutableStateOf(Offset.Zero) }
    val state = rememberTransformableState { zoomChange, offsetChange, rotationChange ->
        scale *= zoomChange
        rotation += rotationChange
        offset += offsetChange
    }
    Box(
        Modifier
            // apply other transformations like rotation and zoom
            // on the pizza slice emoji
            .graphicsLayer(
                scaleX = scale,
                scaleY = scale,
                rotationZ = rotation,
                translationX = offset.x,
                translationY = offset.y
            )
            // add transformable to listen to multitouch transformation events
            // after offset
            .transformable(state = state)
            .background(Color.Blue)
            .fillMaxSize()
    )
}

在这里插入图片描述

rememberTransformableState会返回缩放变化,平移变化,旋转变化这三个值,用于我们操作元素。

如果您需要将缩放、平移和旋转与其他手势结合使用,可以使用 PointerInputScope.detectTransformGestures 检测器。

@Composable
fun TransformableSample() {
    var scale by remember { mutableStateOf(1f) }
    var rotation by remember { mutableStateOf(0f) }
    var offset by remember { mutableStateOf(Offset.Zero) }
    Box(
        Modifier
            .graphicsLayer(
                scaleX = scale,
                scaleY = scale,
                rotationZ = rotation,
                translationX = offset.x,
                translationY = offset.y
            )
            .pointerInput(Unit) {
                detectTransformGestures(
                    panZoomLock = false,
                    onGesture = { _, offsetChange, zoomChange, rotationChange->
                        scale *= zoomChange
                        rotation += rotationChange
                        offset += offsetChange
                    }
                )
            }
            .background(Color.Blue)
            .fillMaxSize()
    )
}

参考

  • Compose文档 - 手势
  • nestedscroll文档
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetpack Compose 从入门到入门(九) 的相关文章

  • Jetpack Compose 从入门到入门(五)

    应用中的状态是指可以随时间变化的任何值 这是一个非常宽泛的定义 xff0c 从 Room 数据库到类的变量 xff0c 全部涵盖在内 由于Compose是声明式UI xff0c 会根据状态变化来更新UI xff0c 因此状态的处理至关重要
  • Jetpack Compose 从入门到入门(六)

    本篇说说Compose中的Canvas 1 Canvas span class token annotation builtin 64 Composable span span class token keyword fun span sp
  • 使用docker-compose搭建Nextcloud个人云盘并开启https教程

    一 前言 之前一直采用LANMP直接搭建服务 xff0c 但后来使用docker后 xff0c 搭建和迁移数据都很方便 xff0c 所以将服务都容器化 下面介绍一下使用docker compose搭建Nextcloud xff0c 并且使用
  • Linux中如何查Jetson Nano中jetpack的版本

    命令 xff1a cat etc nv tegra release 如下图所示 xff0c 输入的内容为 R32 release REVISION 5 1 GCID 26202423 BOARD t210ref EABI aarch64 D
  • ARM服务器安装docker-compose

    我的服务器信息为 Linux ecs 1bc7 0001 4 19 90 17 5 ky10 aarch64 1 SMP Fri Aug 7 13 35 33 CST 2020 aarch64 aarch64 aarch64 GNU Lin
  • Docker——(十五)Docker Compose 实战 MySQL

    MySQL5 version 39 3 1 39 services mysql restart always image mysql 5 7 22 container name mysql ports 3306 3306 environme
  • Docker Compose部署Springboot+Mysql项目

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 在上一篇文章Spring Boot Maven 43 Docker打包中 xff0c 我们实现了将Springboot项目源代码一
  • docker、docker-compose、docker swarm和k8s(Kubernetes)的区别

    文章目录 DockerDocker ComposeDocker SwarmKubernetes Docker Docker 这个东西所扮演的角色 xff0c 容易理解 xff0c 它是一个容器引擎 xff0c 也就是说实际上我们的容器最终是
  • 使用docker-compose配置mysql数据库并且配置用户密码

    下面要求环境 xff1a 一定要安装docker ce和docker compose才能进行下面步骤 linux找到你要放mysql的目录 创建一个docker compose yml 以下配置了外部数据卷 外部配置文件 外部初始化文件 x
  • 更新docker镜像及容器,使用docker-compose命令

    第一种方法 xff1a docker stop 容器名或镜像id 下面一样 docker rm 容器名 docker rmi 镜像名 docker builder 镜像名 docker run d name 容器名 p 对外端口 内部端口
  • docker-compose部署emqx集群 配置带mysql授权认证

    EMQX 是一款大规模可弹性伸缩的云原生分布式物联网 MQTT 消息服务器 作为全球最具扩展性的 MQTT 消息服务器 xff0c EMQX 提供了高效可靠海量物联网设备连接 xff0c 能够高性能实时移动与处理消息和事件流数据 xff0c
  • Jetson查看JetPack版本(tool)

    Jetson查看JetPack版本 查看L4T版本 我的L4T版本为 32 5 1 在官网查找对应的jetpack版本 This page includes access to previously released versions of
  • Docker(四)----Docker-Compose 详解

    1 什么是Docker Compose Compose项目来源于之前的fig项目 xff0c 使用python语言编写 与docker swarm配合度很高 Compose 是 Docker 容器进行编排的工具 xff0c 定义和运行多容器
  • Jetson tx2(JetPack 4.4)配置pytorch环境

    下载pytorch 下载pytorch1 7 xff1a 我的系统是JetPack4 4 xff0c 要求pytorch gt 61 1 7 安装pytorch span class token function sudo span spa
  • Jetpack学习之Navigation

    Jetpack提供了一个名为Navigation的组件 用来管理页面 Actvity和Fragment 以Fragment为主 和App bar Navigation的优势 可视化的页面导航图 便于理清页面间的关系 通过destinatio
  • Android DataBinding的基本使用

    5 DataBinding https developer android com topic libraries data binding custom conversions 数据绑定库是一种支持库 借助该库 您可以使用声明性格式 而非
  • Jetpack学习之Room

    Android采用sqlite作为数据库存储 Room就是Google推出的自己的ORM Object Relational Mapping Room的架构图 Entity 一个Entity对应于数据库中的一张表 Entity类是Sqlit
  • Jetpack学习之Lifecycle

    Jetpack是Google为了解决Android架构问题而引入的 Google官方说的说法 Jetpack是一套库 工具和指南 可以帮助开发者更轻松地编写应用程序 Jetpack中的组件可以帮助开发者遵循最佳做法 摆脱编写样板代码的工作并
  • Github上 简单易用的 Android ViewModel Retrofit框架

    RequestViewModel 长期更新 支持网络请求的ViewMode框架 ViewModel LiveData Retrofit github 地址 https github com miaotaoii RequestViewMode
  • 如何使用docker和docker-compose在本地Testnet上开发EOS区块链

    EOS区块链的开发并不是立竿见影的 因为需要一些非显而易见的组件 需要对它们进行配置和协同工作 nodeos 块生成器守护程序 keosd 钱包守护进程 存储私钥 eosio cpp 智能合约编译器 eosio token 平台的参考标记

随机推荐

  • Warning: Packets out of order. Expected 8 received 0

    环境 xff1a linux 43 mycat 43 hyperf 43 es 原因 xff1a mycat进行了分片 解决 xff1a 修改文件路径 xff1a vendor hyperf database src Connectors
  • Ubuntu下不能切换中文,qt creator无法输入中文,sogo输入法(详细步骤)

    目录 xff1a 1 解决ubuntu 不支持切换中文 xff0c 并安装sogo输入法步骤 xff1b 2 解决Qt Creator不支持中文输入 xff1a 详细步骤 xff1a 一 解决ubuntu 不支持切换中文 xff0c 并安装
  • wordpress插件API入口

    lt php 64 package Moodo Zhong 64 version 1 0 0 Plugin Name Moodo Zhong Plugin URI http wordpress org plugins hello dolly
  • PHP源码目录说明

    1 build 和编译有关的目录 2 ext 扩展库代码 xff0c 例如 MySQL zlib iconv 等我们熟悉的扩展库 其中 ext standard 目录下是常用的标准函数集 3 main 主目录包含主要的 PHP 宏和定义 4
  • 终端程序定义示例

    interrupt 0 外部中断0 interrupt 1 T0中断 interrupt 2 外部中断1 interrupt 3 T1中断 interrupt 4 串口中断 我来告诉你实质 xff1a 单片机的中断处理是这样工作的 xff0
  • lisp学习资料

    中文LISP学习网站 CL HTTP franz com 217条消息 使用hunchentoot搭建Lisp web 服务器 keyboardOTA的博客 CSDN博客
  • GO调用C语言之字符串传递

    C xff1a hello h include lt stdlib h gt include lt stdio h gt include lt string h gt char abc int strnum char str C hello
  • C++-基础语法-cin.getline() 与 cin.get() 的区别,以及getline()函数使用方法

    参考声明 xff1a C 43 43 primer plus https blog csdn net best fiends zxh article details 53064771 https blog csdn net u0114216
  • Kotlin开发中的一些Tips(二)

    接着上一篇 xff0c 最近又整理了一些 1 作用域函数选择 目前有let run with apply 和 also五个作用域函数 官方文档有张表来说明它们之间的区别 xff1a 总结一下有几点区别 xff1a apply和also返回上
  • Jetpack Compose 从入门到入门(一)

    Jetpack Compose 是用于构建原生 Android 界面的新工具包 它使用更少的代码 强大的工具和直观的 Kotlin API xff0c 可以帮助您简化并加快 Android 界面开发 xff0c 打造生动而精彩的应用 它可让
  • Jetpack Compose 从入门到入门(二)

    开始布局部分 这部分我个人感觉没有必要每个组件 属性都详细说到 xff0c 否则篇幅会很长 建立起Compose中的组件与 Android Views的一个对应关系就够了 具体还是需要在实际的使用中去熟悉 1 Column 子元素按竖直顺序
  • Jetpack Compose 从入门到入门(三)

    本篇开始介绍Jetpack Compose 中的修饰符Modifier 修饰符可以用来执行以下操作 xff1a 更改可组合项的大小 布局 行为和外观 添加信息 xff0c 如无障碍标签 处理用户输入 添加高级互动 xff0c 如使元素可点击
  • 【操作系统】Linux系统中直接优化提升CPU性能(已解决)

    文章目录 问题 xff1a 服务器CPU没有调用最高性能 xff0c 导致跑算法的时候处理速度慢一 BIOS方法二 终端直接设置CPU调节器方法1 查看当前CPU调节器2 安装各种依赖库3 最后安装cpufrequtis工具包并设置CPU调
  • Jetpack Compose 从入门到入门(四)

    本篇开始介绍Jetpack Compose 中常用的组件 有一部分之前的文章中也出现过 xff0c 今天详细说明一下 1 Text 日常最常用的应该就是显示文字 xff0c 所以有必要说一下Text控件 首先源码如下 xff1a span
  • Jetpack Compose 从入门到入门(五)

    应用中的状态是指可以随时间变化的任何值 这是一个非常宽泛的定义 xff0c 从 Room 数据库到类的变量 xff0c 全部涵盖在内 由于Compose是声明式UI xff0c 会根据状态变化来更新UI xff0c 因此状态的处理至关重要
  • Jetpack Compose 从入门到入门(六)

    本篇说说Compose中的Canvas 1 Canvas span class token annotation builtin 64 Composable span span class token keyword fun span sp
  • Jetpack Compose 从入门到入门(七)

    本篇进入Compose 动画部分 1 动画预览 在本系列第一篇中我们提到过 xff0c 64 Preview可以帮我们实现UI的预览功能 xff0c 简单的交互和播放动画 在Android Studio Bumblebee xff08 大黄
  • Android 12 变更及适配攻略

    这几个月有点忙 xff0c 一年一篇的适配文章来的有点晚了 但其实也还好 xff0c 因为我们项目也是下半年才适配 我这边也是提前调研踩坑 xff0c 评估一下工作量 这个时间点也完全跟得上Google Play的审核要求 xff08 11
  • Jetpack Compose 从入门到入门(八)

    接着上一篇的动画部分 xff0c 本篇主要是自定义动画与Animatable AnimationSpec 上一篇中 xff0c 出现了多次animationSpec属性 xff0c 它是用来自定义动画规范的 例如 xff1a span cl
  • Jetpack Compose 从入门到入门(九)

    本篇是Compose的手势部分 点击 添加clickable修饰符就可以轻松实现元素的点击 此外它还提供无障碍功能 xff0c 并在点按时显示水波纹效果 span class token annotation builtin 64 Comp