如何使用 Jetpack Compose 创建翻转卡片效果

news2024/12/24 11:39:03

如何使用 Jetpack Compose 创建翻转卡片效果

flip-effect

介绍

在电子商务和银行应用程序中输入卡信息是很常见的情况。我认为让用户更轻松地处理这种情况并创建更吸引眼球的 UI 将很有用。大多数应用程序/网站都喜欢它。

执行

在开发阶段,您需要做的是打开一个 Android 项目并实施 Compose 库。

如果我们继续编码,我们可以检查以下 Compose 代码。
卡片正反面设计
您可以根据上面的设计在屏幕上创建您的卡片。

@Composable
fun AddCreditCard(backgroundColor: Color) {

    var rotated by remember { mutableStateOf(false) }

    val cardType =
        when (result.value?.organization) {
            "MasterCard" -> painterResource(R.drawable.mc)
            "VISA" -> painterResource(R.drawable.visa)
            else -> painterResource(R.drawable.ic_launcher_background)
        }

    val rotation by animateFloatAsState(
        targetValue = if (rotated) 180f else 0f,
        animationSpec = tween(500)
    )

    val animateFront by animateFloatAsState(
        targetValue = if (!rotated) 1f else 0f,
        animationSpec = tween(500)
    )

    val animateBack by animateFloatAsState(
        targetValue = if (rotated) 1f else 0f,
        animationSpec = tween(500)
    )

    Card(
        modifier = Modifier
            .height(220.dp)
            .fillMaxWidth()
            .padding(10.dp)
            .graphicsLayer {
                rotationY = rotation
                cameraDistance = 8 * density
            }
            .clickable {
                rotated = !rotated
            },
        shape = RoundedCornerShape(14.dp),
        elevation = 4.dp,
        backgroundColor = backgroundColor,
        contentColor = Color.White
    ) {
        if (!rotated) {
            Column(
                horizontalAlignment = Alignment.Start,
                verticalArrangement = Arrangement.SpaceBetween,
                modifier = Modifier.padding(start = 8.dp, end = 8.dp, bottom = 8.dp),
            ) {

                Row(horizontalArrangement = Arrangement.SpaceBetween) {
                    Icon(
                        painter = painterResource(R.drawable.ic_contactless),
                        contentDescription = "test",
                        modifier = Modifier
                            .width(50.dp)
                            .height(50.dp)
                            .padding(top = 6.dp, bottom = 6.dp, end = 20.dp)
                            .graphicsLayer {
                                alpha = animateFront
                            },
                        tint = Color.White
                    )
                    Spacer(modifier = Modifier.weight(1f))
                    Image(
                        painter = cardType,
                        contentDescription = "test",
                        modifier = Modifier
                            .width(50.dp)
                            .height(50.dp)
                            .graphicsLayer {
                                alpha = animateFront
                            }
                    )
                }

                result.value?.number?.let {
                    Text(
                        text = it,
                        modifier = Modifier
                            .padding(top = 16.dp)
                            .graphicsLayer {
                                alpha = animateFront
                            },
                        fontFamily = fontName,
                        fontWeight = FontWeight.Normal,
                        fontSize = 25.sp
                    )
                }

                Row(horizontalArrangement = Arrangement.SpaceBetween) {
                    Column(horizontalAlignment = Alignment.Start) {
                        Text(
                            text = "Card Holder",
                            color = Color.Gray,
                            fontSize = 9.sp,
                            fontWeight = FontWeight.Bold,
                            modifier = Modifier
                                .graphicsLayer {
                                    alpha = animateFront
                                }
                        )
                        Text(
                            text = "Mehmet Yozgatli",
                            color = Color.White,
                            fontSize = 15.sp,
                            fontWeight = FontWeight.Bold,
                            modifier = Modifier
                                .graphicsLayer {
                                    alpha = animateFront
                                }
                        )
                    }

                    Spacer(modifier = Modifier.weight(1f))

                    Column(horizontalAlignment = Alignment.Start) {
                        Text(
                            text = "VALID THRU",
                            color = Color.Gray,
                            fontSize = 9.sp,
                            fontWeight = FontWeight.Bold,
                            modifier = Modifier
                                .graphicsLayer {
                                    alpha = animateFront
                                }
                        )
                        result.value?.expire?.let {
                            Text(
                                text = it,
                                color = Color.White,
                                fontSize = 15.sp,
                                fontWeight = FontWeight.Bold,
                                modifier = Modifier
                                    .graphicsLayer {
                                        alpha = animateFront
                                    }
                            )
                        }
                    }

                }
            }
        } else {
            Column(
                modifier = Modifier.padding(top = 20.dp),
            ) {

                Divider(
                    modifier = Modifier
                        .graphicsLayer {
                            alpha = animateBack
                        }, color = Color.Black, thickness = 50.dp
                )

                Text(
                    text = "123",
                    color = Color.Black,
                    modifier = Modifier
                        .padding(10.dp)
                        .background(Color.White)
                        .fillMaxWidth()
                        .graphicsLayer {
                            alpha = animateBack
                            rotationY = rotation
                        }
                        .padding(10.dp),

                    fontSize = 15.sp,
                    textAlign = TextAlign.End
                )

                Text(
                    text = "Developed by Mehmet Yozgatli",
                    color = Color.White,
                    modifier = Modifier
                        .fillMaxWidth()
                        .graphicsLayer {
                            alpha = animateBack
                            rotationY = rotation
                        }
                        .padding(5.dp),

                    fontFamily = fontName,
                    fontWeight = FontWeight.Thin,
                    fontSize = 10.sp,
                    textAlign = TextAlign.Center
                )
            }
        }
    }
}

创建卡片后,将旋转、animateFront 和 animateBack 值作为参数传递给组件时,就完成了动画部分。

ML Kit——银行卡识别

通过使用华为机器学习服务的银行卡识别服务,您可以为用户提供极大的便利。

您可以按照官方文档中的实施步骤进行操作。

https://developer.huawei.com/consumer/en/doc/development/hiai-Guides/dev-process-0000001050038076

输出

  • 卡片翻转效果
    翻转卡片效果示例

  • 使用机器学习套件获取信息
    机器学习套件使用示例

结论

重要的是我们的应用程序要易于使用并让事情变得简单。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vim命令模式指令一览

提示:本文介绍了linux下vim中的快捷指令。 文章目录注意:本文所有指令都只在命令行模式下有效!!! vim指令图: 指令解析命令解析h光标向左移动j光标向下移动k光标向上移动l光标向下移动yy/nyy复制当前行/赋…

2023最新面试题-Java-1

知其然知其所以然 Java之父:詹姆斯高斯林 (James Gosling)。 什么是Java Java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念。意思Java不支持多继承、指针。Java语言具有功能强大和简单易用…

《花雕学AI》14:免费打开就可用,ChatGPT国内12个镜像站盘点与测试

引言 人工智能聊天机器人是能和人说话的智能系统,它可以帮人做很多事。现在,人工智能聊天机器人很厉害,很多人想试试。ChatGPT是一个很厉害的人工智能聊天机器人,是OpenAI做的。它可以和人一样说话,还可以回答问题、承…

无线耳机哪个音质比较好?四百内音质最好的无线耳机排行

蓝牙耳机常常作为手机的伴生产品而出现在人们的日常生活当中,其使用场景也越来越广泛。而随着蓝牙技术的发展,蓝牙耳机在音质上的表现也越来越好。下面,我来给大家推荐几款四百内音质最好的无线耳机,一起来看看吧。 一、南卡小音舱…

射频功率放大器在液体超声声强的光电测量中的应用

实验名称:液体中超声声强的光电测量 研究方向:光电测量 测试目的: 声强是描述声场的基本物理量口,超声效应直接与声强有关。例如在工程技术领域,液体中的声场分布直接影响流场分布口,声强的大小影响着超声波…

腾讯云GPU云服务器、CVM云服务器、轻量应用服务器配置价格表

这就是腾讯云GPU云服务器、CVM云服务器、轻量应用服务器配置价格表,最近整理的。目前腾讯云服务器分为轻量应用服务器、CVM云服务器和GPU云服务器,首先介绍一下这三种服务器。 1、GPU 云服务器(Cloud GPU Service,GPU)…

主从模式、哨兵模式、集群模式(cluster)

主从模式、哨兵模式、集群模式(cluster) redis 实现高可用的方式分为 主从模式、哨兵模式、集群模式(cluster) 1. 主从模式(又称为主从复制) 表现为1个主节点,多个从节点,主节点负…

2023年Python选择题及答案解析【35道】

2023年Python练习题及答案解析1、在Python3中,运行结果为:2、在Python3中,字符串的变换结果为:3、在Python3中,下列程序运行结果为:4、在Python3中,下列程序结果为:5、a与b定义如下&…

【C++】基础篇

C基础篇什么是C命名空间命名空间的三种使用方式C的输入和输出缺省参数缺省参数分类函数重载引用引用的使用场景常引用指针和引用的区别auto关键字auto使用细则auto不能推导的场景基于范围的for循环范围for的使用条件指针空值nullptr什么是C 1982年,Bjarne Stroustr…

AutoGPT保姆级使用教程

1. 介绍Auto-GPT是一个基于ChatGPT的工具,他能帮你自动完成各种任务,比如写代码、写报告、做调研等等。使用它时,你只需要告诉他要扮演的角色和要实现的目标,然后他就会利用ChatGPT和谷歌搜索等工具,不断“思考”如何接…

目标检测【Object Detection】

文章目录基本概念两阶段目标检测算法R-CNNFast R-CNNFaster R-CNNFPNMask R-CNN一阶段目标检测算法SSDYOLOv1YOLOv2YOLOv3目标检测的常用数据集目标检测的标注工具基本概念 目标检测是计算机视觉中的一个重要问题,它的目的是从图像或视频序列中识别出特定的目标&am…

在window上安装python

在Windows上安装python 1.进入python官网https://www.python.org/ 下载配置环境,点击上方downloads,根据系统选择python环境下载(选择windows) 往下拉查找需要的版本并下载 下载后双击就可以安装python了 如何检验是否安装成功 通过【winr】调出【运行】弹窗,输…

数据安全评估体系建设

数据安全评估是指对重要数据、个人信息等数据资产的价值与权益、合规性、威胁、脆弱性、防护等进行分析和判断,以评估数据安全事件发生的概率和可能造成的损失,并采取相应的措施和建议。 数据安全评估的重要性和背景 1.国家法律法规下的合规需要 目前数…

面试-基本计算器 II

题目 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数&…

学生管理系统:含注册登录操作

目录 一、分包概况: 二、USER包 1.AMain类:主函数所在 2.User类:构造账号属性 3.PasswordOperate包:用于登录,注册,修改密码,查看账号操作 (1)Login类:…

Java中「Future」接口详解

主打一手结果导向; 一、背景 在系统中,异步执行任务,是很常见的功能逻辑,但是在不同的场景中,又存在很多细节差异; 有的任务只强调「执行过程」,并不需要追溯任务自身的「执行结果」&#xff…

你可能并不需要useEffect

背景 相信大家在写react时都有这样的经历:在项目中使用了大量的useEffect,以至于让我们的代码变得混乱和难以维护。 难道说useEffect这个hook不好吗?并不是这样的,只是我们一直在滥用而已。 在这篇文章中,我将展示怎…

【Spring源码】讲讲Bean的生命周期

1、前言 面试官:“看过Spring源码吧,简单说说Spring中Bean的生命周期” 大神仙:“基本生命周期会经历实例化 -> 属性赋值 -> 初始化 -> 销毁”。 面试官:“......” 2、Bean的生命周期 如果是普通Bean的生命周期&am…

【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【Flowable】Flowable流程设计器

Flowable流程设计器有两种实现方式 Eclipse DesignerFlowable UI应用 1.Eclipse Designer Flowable提供了名为Flowable Eclipse Designer的Eclipse插件,可以用于图形化地建模、测试与部署BPMN 2.0流程。 (1).下载安装Eclipse 去Eclipse官网下载即可&#xff1a…