让你易上手的Jetpack Compose教程- 2. 帮你写出漂亮的小组件-Jetpack Glance
创始人
2024-06-03 12:58:33
0

因为在iOS14中推出的小组件的功能,让大家重新开始关注起小组件了。虽然安卓是很久之前就有了小组件的功能,但是因为它的不美观和不实用,以及对开发者也不够友好,逐渐变成为废弃的状态。

直到Android12,再一次更新了小组件的的相关功能,并且为了减少开发者的负担而推出了Jetpack Glance库。该库是基于Compose,是开发者利用Compose的命令快速上手进而减少开发成本。

那让我们开始探究一下Glance吧。

1. 加上库的依赖

把下面的依赖信息添加到app的build.gralde文件中。

dependencies {implementation("androidx.glance:glance:1.0.0-alpha01")
}android {buildFeatures {compose = true}composeOptions {kotlinCompilerExtensionVersion = "1.1.0-beta03"}kotlinOptions {jvmTarget = "1.8"}
}

2. 继承GlanceAppWidget类

我们需要继承GlanceAppWidget类然后重写Content方法。

classGlanceWidget : GlanceAppWidget(){@ComposableoverridefunContent() {// write compose ui code here}
}

在Content方法内写我们已经很熟悉的Compose UI语句就可以了。

但是这里有一点需要格外的注意。我们在使用Compose UI组件时需要使用glance的提供UI组件。而不是Compose Material的UI组件。

组件的具体路径如下:(以Text为举例)Glance提供的Compose UI组件: androidx.glance.text.Text Compose Material提供的Compose UI组件:androidx.compose.material.Text

Glance提供的所有Compose UI组件列表如下:

Box, Column, Row, Text, Image, Button, LazyColumn, Spacer.

简单说明一下,为什么这里需要使用的是Glance提供的组件而不是Compose Material的。

因为Glance的底层还是通过构建RemoteViews来实现小组件的显示。所以我们只能利用Glance提供的UI组件,然后让Glance帮我们把写好的UI代码转换成RemoveViews。

不光是需要使用Glance提供的Compose UI组件,为ui组件设置modifier的时候我们也不能使用普通的modifier,而是需要使用Glance提供的GlanceModifier。

3. 小组件布局的自适应

利用Glance,我们可以为小组件设置不同大小的布局来实现用户在自由的调节组件大小时显示不同的界面。

为了实现小组件布局的自适应,我们首先要设置具体的布局大小。我们要重写sizeMode变量,在这里规定小组件都有哪些大小的布局。

private val SMALL_BOX = DpSize(90.dp, 90.dp)private val BIG_BOX = DpSize(180.dp, 180.dp)private val VERY_BIG_BOX = DpSize(300.dp, 300.dp)private val ROW = DpSize(180.dp, 48.dp)private val LARGE_ROW = DpSize(300.dp, 48.dp)private val COLUMN = DpSize(48.dp, 180.dp)private val LARGE_COLUMN = DpSize(48.dp, 300.dp)
override val sizeMode = SizeMode.Responsive(setOf(SMALL_BOX, BIG_BOX, ROW, LARGE_ROW, COLUMN, LARGE_COLUMN))

然后,我们在Content()中调用 LocalSize.current来查看当前组件的大小,根据当前组件的大小显示不同的布局。具体代码如下:

@Composableoverride fun Content() {val list = listOf(ACTION_ACTIVITY, ACTION_SERVICE, ACTION_BROADCAST, ACTION_CALLBACK)when (LocalSize.current) {SMALL_BOX, BIG_BOX, VERY_BIG_BOX -> {WidgetBoxView(list)}ROW, LARGE_ROW -> {WidgetRowView(list)}COLUMN, LARGE_COLUMN -> {WidgetColumnView(list)}}}

相关的UI代码如下。

@Composablefun WidgetRowView(list: List) {Row(modifier = GlanceModifier.fillMaxSize().cornerRadius(24.dp).background(Color(0xfff1f1f1)),horizontalAlignment = Alignment.Horizontal.CenterHorizontally,verticalAlignment = Alignment.CenterVertically) {list.forEach { str ->Button(text = str,onClick = getAction(str, LocalContext.current))}}}

4. 设置GlanceAppWidgetReceiver

我们需要继承GlanceAppWidgetReceiver类。然后重写glanceAppWidget变量的get方法。

在get方法中返回上面提到的继承自GlanceAppWidget的你创建的类。

在我这个例子中是返回GlanceWidget()。

需要这一步的原因是让App和Glance小组件进行连接。

具体代码如下。

classGlanceReceiver : GlanceAppWidgetReceiver() {overrideval glanceAppWidget: GlanceAppWidgetget() = GlanceWidget()
}

5. 设置actions

开发者可以使用Glance提供的如下方法来调用Broadcast, Service, Activity和Callback。

  • actionStartBroadcast

  • actionStartService

  • actionStartActivity

  • actionRunCallback

在这里我只展示如何实现Callback的调用,关于其他的方法的调用请查看我的GitHub。

首先,我们需要创建一个类且继承ActionCallback, 然后重写onRun方法。

classGlanceCallbackAction : ActionCallback {overridesuspendfunonRun(context: Context, glanceId: GlanceId, parameters: ActionParameters) {Handler(context.mainLooper).post() {val parameter = parameters[GlanceWidget.ACTION_PARAMETERS_KEY]Toast.makeText(context, "GlanceClickAction, parameter: $parameter", Toast.LENGTH_LONG).show()}}
}

之后,我们需要在按钮的clickable中去实现调用ActionCallback的代码。如果想要传递参数,需要使用actionParametersOf参数。actionParameter本质上是HashMap, 所以需要以Key和Value的方式放入需要传递的参数。具体代码如下:

actionRunCallback(GlanceCallbackAction::class.java,parameters = actionParametersOf(ACTION_PARAMETERS_KEY to str)
)
val ACTION_PARAMETERS_KEY = ActionParameters.Key("parameters_keys")

6. 在AndroidManifest文件中设置相关信息

我们不光要为上面的提到的service, broadcast等相关组件添加信息,还要把在小题目4中提到的GlanceAppWidgetReceiver的信息添加到AndroidManifest.xml文件中。

......

7. 设置小组件的元数据

小组件的元数据指的是小组件相关的配置信息。该信息最终是要设置在AndroidManifest文件中的receiver中的。

            

xml/glacen_info的具体代码如下。


"android:minWidth="180dp"android:minHeight="50dp"android:resizeMode="horizontal|vertical"android:targetCellWidth="3"android:targetCellHeight="1"android:widgetCategory="home_screen" />

widgetCategory: 声明小组件应该显示在哪个界面中。一共有home_screen(主屏幕)和keyguard(锁屏界面)两种。但是锁屏界面只能是Android5一下才可以设置,所以现在基本上只能设置主屏幕了。

targetCellWidth, targetCellHeight: 在Android12中新加的属性,声明组件应该以怎样的长高来显示。

previewImage: 设置小组件的预览图片,该图片会显示在选择小组件时的界面中。

8、其他:

Android知识点笔记:

Android开发核心知识点笔记

Android Framework核心知识点笔记

Android Flutter核心知识点笔记与实战详解

音视频开发笔记,入门到高级进阶

性能优化核心知识点笔记

Android开发高频面试题,25个知识点整合

Android开发核心架构知识点笔记

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...