Android JetpackCompose使用教程讲解

目录
  • 概况
  • 开启新工程
  • 文件结构
    • 根结构
    • 拆分方法
  • 官方四节课教程细节剖析
    • data class
    • 组件代码翻译
    • 单例类
    • 适配器的替代品
    • 简单小动画

概况

compose 摒弃了原生开发模式中的 xml,代码结构类似于 flutter

compose 仅支持 kotlin,虽然这玩意语法糖多但是也不难学

compose 可以通过极短的代码行数构建完善页面

开启新工程

首先请去 android 官网下载 android studio;

官网下载速度是正常的,别担心;

之后根据提示安装 android sdk 以及 ndk,如果必须的话你还可以装一个模拟器;

把手机直接连接到电脑上就可以进行真机调试了(记得把手机的调试模式打开);

一切就绪,打开 android studio,点击 file->new->new project->empty compose activity

稍等一会,工程很快构建完毕

文件结构

创建新工程后,默认会打开 MainActivity.kt 文件,这是我们的主页面

根结构

class MainActivity2 : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposeDemoTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    Greeting("Android")
                }
            }
        }
    }
}

setContent 在这里写入页面内容,通过一个个组件逐步构造

ComposeDemoTheme 表示根据默认主题包中的内容进行设置(默认主题包就在和 mainactivity 同级别的 themes 文件夹)

Surface 构建页面表面的一个组件

拆分方法

为了避免组件过度嵌套导致产生”死亡三角”,务必记得把必要的组件拆出来作为一个单独的方法写!

方法写在本 activity 的 class 内部,那么同文件夹内的其他 kotlin 文件的方法都不会冲突;

若写在 class 外(默认),则不同文件夹将可能会发生名称重复的冲突;

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!")
}

加了 @Composable 注解的方法,表示这是一个组件,该注解必须添加!

该组件方法内使用了 text

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    ComposeDemoTheme {
        Greeting("Android")
    }
}

compose 内置了一个临时预览机制,即 preview;

加了@Preview 注解的代码表示该代码将作为临时预览而展示;

临时预览的方法不会对最终编译生成的结果产生任何影响!!!

点击代码框右上角的 split,即可拆分为 代码+预览 布局

一切就绪后点击 build,即可渲染预览页面

官方四节课教程细节剖析

官方教程地址:https://developer.android.google.cn/jetpack/compose/tutorial

data class

data class 类似于 typescript 的 interface,可以理解为定义了一个对象;

msg: Message 直接将 Message 作为一个类型来使用;

之后直接在 setContent 里面调用组件即可!

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MessageCard(Message("Android", "Jetpack Compose"))
        }
    }
}
data class Message(val author: String, val body: String)
@Composable
fun MessageCard(msg: Message) {
    Text(text = msg.author)
    Text(text = msg.body)
}

组件代码翻译

@Composable
fun MessageCard(msg: Message) {
    // 使用padding内部撑开,all表示四周撑开
    Row(modifier = Modifier.padding(all = 8.dp)) {
        Image(
            painter = painterResource(R.drawable.profile_picture),
            contentDescription = "Contact profile picture",
            modifier = Modifier
                // 设置该组件的大小为40dp
                .size(40.dp)
                // 把图片变成圆形的
                .clip(CircleShape)
        )
        // 在image和column之间添加一个水平空格!
        Spacer(modifier = Modifier.width(8.dp))
        Column {
            Text(text = msg.author)
            // 这里添加的是一个垂直空格!
            Spacer(modifier = Modifier.height(4.dp))
            Text(text = msg.body)
        }
    }
}

单例类

教程中我们用到了 SampleData,然而由于外网无法访问,数据集自然下载不了,但是我们可以简单的模拟一个数据集:

object 创建单例类;

listOf 模拟列表!

object SampleData {
    val conversationData = listOf(
        Message(
            "jack",
            "test name"
        ),
        Message(
            "fakeman",
            "idaofihoeqh iodhoe hfqow " +
                    "ehfsdla hfioeh fowh fldsah lfhoqei hfo" +
                    " hod hsafohewqgjlfjdsnvc,mxbg kjwfhw" +
                    " hoe hfsdhf kwejashd has jhdqwo oiadhf oiha " +
                    "oi dosi awqi jiojagakfjk ladfi jslkf h" +
                    "lwkeh flkadsh flah fioewhfoadshlfhsa"
        ),
    )
}

适配器的替代品

// by表示使用委托,设置一个针对于本compose的全局状态
// 可以理解为isExpanded是一个全局变量!
var isExpanded by remember { mutableStateOf(false) }
// clickable设置column中项目是否可以点击,以及点击后执行的代码
// 代码和vue类似,点一下就反转一下,达到开启和收回的效果
Column(modifier = Modifier.clickable { isExpanded = !isExpanded }) {
    ...
    Surface(
        shape = MaterialTheme.shapes.medium,
        elevation = 1.dp,
    ) {
        Text(
            text = msg.body,
            modifier = Modifier.padding(all = 4.dp),
            // 判断全局状态isExpanded值
            // 如果isExpanded为true,那么显示所有行(即展开)
            // 如果isExpanded为false,那么仅显示一行(即收缩)
            maxLines = if (isExpanded) Int.MAX_VALUE else 1,
            style = MaterialTheme.typography.body2
        )
    }
}

简单小动画

// 同样的委托,注册全局动画状态
// 由于内容过于庞杂,后续将会详细介绍动画状态是个什么东西!
val surfaceColor by animateColorAsState(
    if (isExpanded) MaterialTheme.colors.primary else MaterialTheme.colors.surface,
)

到此这篇关于Android JetpackCompose使用教程讲解的文章就介绍到这了,更多相关Android JetpackCompose内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android Jetpack Compose无限加载列表

    目录 前言 方法一: paging-compose 方法二:自定义实现 添加 LoadingIndicator 总结 前言 Android 中使用 ListView 或者 RecycleView 经常有滚动到底部自动 LoadMore 的需求,那么在 Compose 中该如何实现呢? 两种方法可供选择: 基于 paging-compose 自定义实现 方法一: paging-compose Jetpack 的 Paging 组件提供了对 Compose 的支持 dependencies { ..

  • Android Jetpack Compose开发实用小技巧

    目录 前言 实用小技巧 如何移除View点击阴影 Text文本如何垂直居中 如何移除Button的点击阴影 Dialog宽度如何全屏 如何提升编码效率 前言 在Compose开发的过程中,我们会经常遇到一些看起来很简单却不知道如何处理的小问题,比如去除点击阴影.Dialog全屏等问题,本文记录了这些常见小问题的处理方式.如有更好方案欢迎大佬们交流探讨- 实用小技巧 如何移除View点击阴影 这里的View指的是除了Button系列的之外,如Button.TextButton等,也就是自身没有on

  • Android Jetpack结构运用Compose实现微博长按点赞彩虹效果

    目录 原版 1. Compose 动画 API 概览 2. 长按点赞动画分解 3. 彩虹动画 3.1 状态管理 AnimatedRainbow animatedRainbows 列表 3.2 内容绘制 4. 表情动画 4.1 状态管理 AnimatedEmoji infiniteRepeatable CubicBezierEasing 抛物线动画 animatedEmojis 列表 4.2 内容绘制 5. 烟花动画 5.1 状态管理 AnimatedFlower keyframes animat

  • Android Jetpack Compose实现列表吸顶效果

    目录 stickyHeader 实体类 加载假数据 吸顶标题 二级条目 完整代码 效果图 安卓传统的 Recyclerview 打造悬浮头部StickyHeader的吸顶效果,十分麻烦,而在Compose中就简单多了 stickyHeader Compose设计的时候考虑得很周到,他们提供了stickyHeader 作用就是添加一个粘性标题项,即使在它后面滚动时也会保持固定.标头将保持固定,直到下一个标头取而代之. 参数key - 表示唯一的密钥键. 它不允许对列表出现使用相同的键.密钥的类型应

  • Android中分析Jetpack Compose动画内部的实现原理

    目录 前言 正文 总结 前言 Compose的动画Api用起来很简单,效果看起来很神奇,那么它内部到底是如何运转的呢? 使用动画的代码示例: var isOffset by remember { mutableStateOf(false) } val offsetAnimation by animateDpAsState(targetValue = if (isOffset) 100.dp else 0.dp) Button( onClick = { isOffset = !isOffset }

  • Android开发Jetpack Compose元素Modifier特性详解

    目录 正文 有序性 不可变性 正文 本文将会介绍Jetpack Compose中的Modifier.在谷歌官方文档中它的描述是这么一句话:Modifier元素是一个有序.不可变的集合,它可以往Jetpack Compose UI元素中添加修饰或者各种行为.例如,背景.填充和单击事件监听器装饰或添加行为到文本或按钮.本文将会从修饰符的两个特性有序和不可变入手来探究修饰符的应用,以下是本文目录: 有序性 不可变性 有序性 官方对修饰符定义的这个特性包含两个层面的意思,一是修饰符的使用是链式的它是有先

  • Android JetpackCompose使用教程讲解

    目录 概况 开启新工程 文件结构 根结构 拆分方法 官方四节课教程细节剖析 data class 组件代码翻译 单例类 适配器的替代品 简单小动画 概况 compose 摒弃了原生开发模式中的 xml,代码结构类似于 flutter compose 仅支持 kotlin,虽然这玩意语法糖多但是也不难学 compose 可以通过极短的代码行数构建完善页面 开启新工程 首先请去 android 官网下载 android studio: 官网下载速度是正常的,别担心: 之后根据提示安装 android

  • Android Studio使用教程(五):Gradle命令详解和导入第三方包

    Android Studio + Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看.编译并导入第三方开源项目的方法. Sublime + Terminal编译并查看源码 首先来给大家介绍一种简便并且个人最喜欢的一种办法.很多时候我们在GitHub上看到一个不错的开源项目,一般有两种需求,阅读源码和查看运行效果,如果是单纯的查看源码我更喜欢用一些轻量级编辑器,如vim,sublime等,vim不是很熟练,所以个人一种都习惯用sublime来查看

  • Android Studio使用教程(四):Gradle基础

    其实很早之前也写了一篇Gradle的基础博客,但是时间很久了,现在Gradle已经更新了很多,所以暂且结合Stduio 1.0正式版与最新的Gradle语法来详细讲解下,小伙伴们直接跟我一步步来学习吧. 什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 安装Gradle 在Android Studio系列教程一–下载与安装中新建项目成功后会下载Grad

  • Android 基础入门教程——开发环境搭建

    现在主流的Android开发环境有: Eclipse + ADT + SDK Android Studio + SDK IntelliJ IDEA + SDK 现在国内大部分开发人员还是使用的Eclipse,而谷歌宣布不再更新ADT后,并且官网也去掉了集成Android开发环境的Eclipse下载链接,各种现象都表示开发者最后都终将过渡到Android Studio,当然这段过渡时间会很长,但如果你是刚学Android的话建议直接冲Android Studio着手:而且很多优秀的开源项目都是基于

  • Android高手进阶教程(二十六)之---Android超仿Path菜单的功能实现!

    Hi~大家好,出来创业快3个月了,一切还不错,前一段时间用了业余时间搞了个问答类网站YQMA.想做中国的stackoverflow,哈哈,只是YY下,希望大家多多支持! 好了,今天给大家分享的是Path菜单的简单实现,可以支持自定义方向(左上,右上,右下,左下),并且可以自定义菜单的个数,难点就是菜单的摆放位置(动态设置margin),还有动画的实现,其实动画只是简单用了个TranslateAnimation,N个菜单一起移动的时候感觉很cool~ 这里也用到了自定义标签,这里不懂的童鞋可以看我

  • Android Studio使用教程(三):常用快捷键

    Android Studio 1.0正式版发布啦 今天是个大日子,Android Studio 1.0 终于发布了正式版, 这对于Android开发者来说简直是喜大普奔的大消息啊,那么就果断来下载使用. 官方下载地址: http://developer.android.com/sdk/index.html 如果你之前已经使用其他版本的Studio,那么直接覆盖就好了,如果是第一次使用,那么参照Android Studio系列教程一进行安装配置. 于此同时一起更新的还有SDK Tools等,打开S

  • Android Studio使用教程(六):Gradle多渠道打包

    由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了. 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: 复制代码 代码如下: <meta-data     android:name="UMENG_CHANNEL"     android:value="Channel_ID" /&g

  • Android ActionBar使用教程

    ActionBar的引入方式: 有几种,从 Android 3.0(API lever 11) 开始,所有使用 Theme.Holo 主题(或者它的子类)的 Activity 都包含了 action bar,当 targetSdkVersion 或 minSdkVersion 属性被设置成 "11" 或更大时,它是默认主题.为了兼容Android3.0之前的低版本,actionbar通常通过extends集成Support包下的AppCompatActivity实现,同时需要使用The

  • ubuntu19系统及以下版本安装android studio的教程

    根据往日的经验,完成一次任务做好笔记是一个很好的习惯!安装环境为ubuntu 首先下载: 1.android studio 下载链接:这里是官网 2.java jdk 下载链接:java官网 这里需要下载的是 dk-13.0.1_linux-x64_bin.tar.gz ,X64代表电脑是64位系统.tar.ge是lilnux可以直接解压的文件类型 第二步把下载好的文件直接解压到下载好的目录 鼠标右键单击直接解压到当前位置 第三步安装java和android 使用cp -r指令直把下载好文件复制

  • Android studio 2020中的Android SDK 下载教程

    1.为了避免sdk到处找麻烦,我这边直接给你提供一个sdk 云盘下载: 链接: https://pan.baidu.com/s/1ttkUMuEW1pNg9Qx391rE7Q 提取码: nfj6 2.将sdk下载下来解压,在Android studio File->Setting->Android SDK Location中添加该解压的路径,如下图.(我这个适用window的) 3.我这个sdk,有点老,只到Android 5.0,需要配置更新,勾选Force https://......复选

随机推荐