Jetpack Compose按钮组件使用实例详细讲解

目录
  • 概述
  • 1.普通Button按钮
  • 2.IconButton图标按钮
  • 3.FloatingActionButton悬浮按钮
  • 总结

概述

按钮组件Button是用户和系统交互的重要组件之一,它按照Material Design风格实现,我们先看下Button的参数列表,通过参数列表了解下Button的整体功能

@Composable
fun Button(
    onClick: () -> Unit, // 点击按钮时的回调
    modifier: Modifier = Modifier, // 修饰符
    enabled: Boolean = true, // 是否启用按钮
    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
    elevation: ButtonElevation? = ButtonDefaults.elevation(), // 按钮的阴影
    shape: Shape = MaterialTheme.shapes.small,
    border: BorderStroke? = null,
    colors: ButtonColors = ButtonDefaults.buttonColors(),
    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
    content: @Composable RowScope.() -> Unit
)

Button组件的第一个参数onClick是必填项,这是按钮组件最重要的功能,通过回调响应用户的点击事件,最后一个参数content也是必填项,展示按钮的内容。Compose 的Button组件默认没有任何UI,它仅仅是一个响应onClick的容器,它的UI需要在content中通过其他组件实现

1.普通Button按钮

假设我们需要创建一个显示文字的Button,代码如下:

  @Composable
    fun ButtonDemo()
    {
        Button(onClick = { /*TODO*/ }) {
            Text(text = "OK")
        }
    }

运行结果:

假如我们想在按钮文字的左边加一个图标,代码如下

    @Composable
    fun ButtonIconDemo(){
        Button(onClick = { /*TODO*/ }) {
            Icon(imageVector = Icons.Filled.Done, contentDescription = null,
            modifier = Modifier.size(ButtonDefaults.IconSize))
            Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing))
            Text(text = "OK")
        }
    }

这样就在文字“OK”的左边加了一个打勾的图标了

运行结果:

在传统的Button中,有一个很好用的功能,就是selector,即点击按钮的时候,可以自定义按钮的点击效果,在Compose中当然也可以,Button中的参数interactionSource就是做这个事情的。interactionSource通过以下的桑格函数获取当前组件的状态的:

interactionSource.collectIsPressedAsState(): 判断是否是按下状态

interactionSource.collectIsFocusedAsState():判断是否是获取焦点的状态

interactionSource.collectIsDraggedAsState():判断是否拖动

我们可以通过实例来看下如何使用interacrtionSource来实现类似传统button的selector效果,代码如下:

    @Composable
    fun InteractionButtonDemo()
    {
        val interact = remember {
            MutableInteractionSource()
        }
        val pressState = interact.collectIsPressedAsState()
        val borderColor = if(pressState.value) Color.Green else Color.Red
        Button(onClick = { /*TODO*/ },
           border = BorderStroke(2.dp, color = borderColor),
            interactionSource = interact
        ) {
            Text(text = "Long click")
        }
    }

上面的代码实现的是按钮在通常情况下边框为红色,点击的时候边框为绿色

运行结果:

Button 并非唯一的可点击组件,理论上任何Compose组件都可以通过Modifier.clickable修饰符制作成可点击组件,而当Button被点击的时候,需要额外进行一些事件响应处理,比如水波纹的处理,Button 的onClick在底层是通过覆盖Modifier.clickable实现的,所以我们使用button时不要为Button覆盖Modifier.clickable.

2.IconButton图标按钮

IconButton组件实际上只是Button组件的简单封装,它就是一个可以点击的图标,它一般用于应用栏中的导航或者其他的行为,我们需要在IconButton组件里面提供一个图标组件,这个图标组件的尺寸一般是24x24dp,看下面的例子:

   @Composable
    fun IconButtonDemo()
    {
        IconButton(onClick = { /*TODO*/ }) {
            Icon(imageVector = Icons.Filled.Favorite,
                contentDescription = null)
        }
    }

运行结果

简单例子,不多讲解

3.FloatingActionButton悬浮按钮

FloatingActionButton悬浮按钮代表当前页面的主要行为,它也需要我们提供一个Icon组件,代码如下:

    @Composable
    fun FloatButtonDemo()
    {
        FloatingActionButton(onClick = { /*TODO*/ }) {
            Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = null)
        }
    }

运行结果:

悬浮按钮其实还有一个带文字的扩展悬浮按钮ExtendedFloatingActionButton组件,使用方法如下:

   @Composable
    fun ExtFloatButtonDemo(){
        ExtendedFloatingActionButton(icon = {Icon(imageVector = Icons.Filled.Favorite, contentDescription = null ) },
            text = { Text(text = "我喜欢的") },
            onClick = { /*TODO*/ })
    }

运行结果:

总结

以上就是今天的内容,本文主要介绍了按钮组件的使用,以及图标按钮和悬浮按钮,这些按钮在开发中调试和实现实际的需求都很有用,建议读者多做练习。慢慢使用到自己的项目当中去

到此这篇关于Jetpack Compose按钮组件使用实例详细讲解的文章就介绍到这了,更多相关Jetpack Compose按钮组件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Jetpack Compose基础组件之文字组件

    目录 概述 文字组件 1.Text 文本 2.Text的style文字样式 3.maxLines参数 4.fontFamily字体风格 5.AnnotatedString多样式文字 6.SelectionContainer可选中文字 7.TextField输入框 8.OutlinedTextField边框样式输入框 9.BasicTextField 总结 概述 文本是UI界面中最常见的元素之一,在Compose中,文字组件扮演着重要的角色,文字组件是遵循Material Design规范设计的上

  • 使用Jetpack Compose实现翻转卡片效果流程详解

    目录 介绍 执行 ML Kit银行卡识别 输出 结论 如何使用 Jetpack Compose 创建翻转卡片效果 介绍 在电子商务和银行应用程序中输入卡信息是很常见的情况.我认为让用户更轻松地处理这种情况并创建更吸引眼球的 UI 将很有用.大多数应用程序/网站都喜欢它. 执行 在开发阶段,您需要做的是打开一个 Android 项目并实施 Compose 库. 如果我们继续编码,我们可以检查以下 Compose 代码. 您可以根据上面的设计在屏幕上创建您的卡片. @Composable fun A

  • Android使用Jetpack Compose开发零基础起步教程

    目录 永远的Hello World 分解的HelloWorld代码 预览函数 先搭建好之后呢,我们就来做第1个例子. 永远的Hello World 先搭建好之后呢,我们就来做第1个例子,编程的第1个例子永远是hello world的,下面呢,我们就来做hello world的例子. 实现hello的例子步骤如下. 创建项目,启动Android Studio工具,新建一个项目,在New Project对话框中Empty Compose Activity,如图所示. 然后点击下一步打开对话框,如图所

  • 融会贯通Android Jetpack Compose中的Snackbar

    目录 正文 主要的实现思路 Snackbar UI部分 正文 开始写Compose的时候,真的有点不习惯.思考方式和以前完全不同,有点类似ReactNative. 写习惯了之后,还真有点欲罢不能,行云流水~ Snackbar感觉就是Toast Plus版,可以自定义视图,还可以进行交互,可以用在很多地方实现意想不到的效果. 主要的实现思路 主要的实现思路有两部步: 1.Snackbar的控制逻辑 2.Snackbar的UI部分 Snackbar UI部分 class MainActivity :

  • Jetpack Compose实现对角线滚动效果

    目录 缘起 初试 探索 学习 FreeScrollState freeScroll 总结 缘起 不久前刷到 newki 前辈的文章,用自定义 viewGroup的方式实现了如图效果: Android自定义ViewGroup嵌套与交互实战,幕布全屏滚动效果 我当时的反应: new bee ! new bee ! 这效果不错 初试 大佬用 Android View 出来了,那能否用 Google 新一代 UI Compose 来整一个呢? 正好手上有本 fun 神写得书 <Jetpack Compo

  • Jetpack Compose图片组件使用实例详细讲解

    目录 概述 示例解析 1.Icon图标组件 2.Image图片组件 总结 概述 在Compose中,图片组件主要有两种,分别是显示图标的Icon组件和显示图片的Image组件,当我们显示一系列的小图标的时候,我们可以使用Icon组件,当显示图片时,我们就用专用的Image组件.在Android传统的View中,我们显示图片和图标都是使用ImageView.我个人比较喜欢Compose的这种分开的方式,增加了代码的可读性. 示例解析 1.Icon图标组件 Icon组件用于展示一系列的小图标,它支持

  • Jetpack Compose常用组件详细介绍

    目录 1. Text 2. Image 3. LazyColumn 1. Text 日常最常用的应该就是显示文字,所以有必要说一下Text控件.首先源码如下: @Composable fun Text( text: String, modifier: Modifier = Modifier, color: Color = Color.Unspecified, fontSize: TextUnit = TextUnit.Unspecified, fontStyle: FontStyle? = nu

  • MongoDB整合Spring实例详细讲解(含代码)

    写这篇文章也做了下思考,首先是本人技术欠佳.但就是喜欢研究一些东西.因为在此之前有很多的朋友已经写过类似的,很多我也看过,但是讲解的不够深入.对有些朋友提出的问题不能给出答案.在这里,我根据我目前的能力对其进行整理.并最终运行成功. 在测试过程中出现过一下问题: 1.org/springframework/data/mapping/context/MappingContextAware 2.src-resolve: Cannot resolve the name 'repository:repo

  • 易语言图形按钮组件切换类型使用讲解

    类型属性 所属对象:图形按钮 : 数据类型:整数型: 可供选择的属性值: 0.按钮 1.选择框 例程 说明 点击图形按钮后,如果图形按钮类型为"按钮"则设置类型为"选择框",如果为"选择框"则设置为按钮. 注意,当为"按钮"型,则图形按钮的"选中"属性不可以使用,如果为"选择框"类型,则图形按钮的"点燃图片"属性不可以使用. 运行结果: 总结 以上就是这篇文章的全部内

  • 基于Django框架的权限组件rbac实例讲解

    1.基于rbac的权限管理 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,一个角色拥有若干权限.这样,就构造成"用户-角色-权限"的授权模型.在这种模型中,用户与角色之间,角色与权限之间都是多对多的关系. 简单的模型图示如下: 2.Rbac组件的基本目录结构: 3.按照写的流程,来讲解rbac组件中的各个部分,以及功能, 3.1 models数据库表设计(models.py). 为了在

  • Android开发Jetpack组件Room用例讲解

    目录 一.简介 二.导入 三.使用 3.1 创建 Entity 类 3.2 创建 Dao 类 3.3 创建 Database 抽象类 3.4 测试 四.数据库升级 4.1 简单升级 4.2 规范升级 4.2.1 新增一张表 4.2.2 修改一张表 4.3 测试 一.简介 Room 是 Google 官方推出的数据库 ORM 框架.ORM 是指 Object Relational Mapping,即对象关系映射,也就是将关系型数据库映射为面向对象的语言.使用 ORM 框架,我们就可以用面向对象的思

  • Vue组件之间的通信方式详细讲解

    目录 前言 一.父级传数据给子级 1.传输固定的具体数据 2.动态语法 3.子组件调用父组件 二.子级传数据给父级 1.使用自定义事件 2.$refs的使用 3.同级别组价以及任意组件之间的数据传递 前言 在前面,我们已经了解了vue的组件以及vue组件之间的层级关系,这个在博主的往期博客,感兴趣的可以往前挪,地址是: 1.vue组件 2.vue组件的层级关系 本文主要编写记录的是,组件之间的通信的模式以及通信的方式,我们的组件之间只能调用自己的属性和自己的方法,不能调用其他组件的属性以及方法,

  • React生命周期与父子组件间通信知识点详细讲解

    目录 声明周期 声明周期解析 生命周期函数 Constructor componentDidMount componentDidUpdate componentWillUnmount 不常用的生命周期函数 认识组件间的通信 参数propTypes 限制单个元素 默认 Prop 值 对于函数式组件 子组件传递父组件 声明周期 很多的事物都有从创建到销毁的整个过程,这个过程称之为是生命周期: React组件也有自己的生命周期,了解组件的生命周期可以让我们在最合适的地方完成自己想要的功能: 生命周期和

  • Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)

    在git命令行下,执行以下命令完成环境的搭建: 1,npm install --global vue-cli 安装vue命令行工具 2,vue init webpack vue-demo 使用vue命令生成一个webpack项目,项目名称为vue-demo 3,cd vue-demo 切入项目 4,npm install安装package.json中的所有依赖包 5,npm run dev运行项目 一.父组件向子组件传递数据 然后删除默认的Hello.vue组件,把App.vue整理成以下样子:

  • python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例

    PyQt5切换按钮控件QPushButton简介 QAbstractButton类为抽象类,不能实例化,必须由其他的按钮类继承QAbstractButton类,来实现不同的功能和表现形式,常见的按钮QPushButton,QToolButton,QRadioButton和QCheckBox这些按钮均继承自QAbstractButton类,根据各自的使用场景通过图形显示出来 QAbstractButton提供的状态如下表 状态 含义 isDown() 提示按钮是否已按下 isChecked() 提

  • SpringCloud超详细讲解负载均衡组件Ribbon源码

    目录 前言 项目实战 创建项目 启动项目验证 源码分析 选择服务 地址替换 总结 前言 上一篇文章中我们通过自己开发了一个负载均衡组件,实现了随机算法的负载均衡功能,如果要实现其他算法,还需要修改代码增加相应的功能.这一篇文章,我们将介绍一个更简单的负载均衡实现,使用**@LoadBalanced**注解实现负载均衡的功能. 项目实战 创建项目 同样的,我们的项目现在依然有一个registry注册中心,一个provider服务提供者,接下来,我们再次修改一下consumer服务消费者的代码: @

随机推荐