当前位置: 首页 > article >正文

Jetpack架构组件学习——使用Glance实现桌面小组件

基本使用

1.添加依赖

添加Glance依赖:

// For AppWidgets support
   implementation "androidx.glance:glance-appwidget:1.1.0"

   // For interop APIs with Material 3
   implementation "androidx.glance:glance-material3:1.1.0"

   // For interop APIs with Material 2
   implementation "androidx.glance:glance-material:1.1.0"

2.正常的相关设置

xml文件夹添加小组件widget_info.xml配置:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:targetCellWidth="2"
    android:targetCellHeight="2"
    android:minWidth="250dp"
    android:minHeight="250dp"
    android:updatePeriodMillis="0"
    android:initialLayout="@layout/glance_default_loading_layout"
    tools:targetApi="s">
</appwidget-provider>

清单文件配置:

<receiver android:name=".appwidgets.MyAppWidgetReceiver"
	android:exported="true">
	<intent-filter>
		<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
	</intent-filter>
	<meta-data
		android:name="android.appwidget.provider"
		android:resource="@xml/widget_info" />
</receiver>

3.创建widget对象和实现界面

需要注意的几点:

1、界面的Row,Column,Text等,注意要使用Glance的包下的,否则会无法正常显示界面

官方也是说明了,Row,Box,Column实际最后创建的对象对应的Linearlayout和Framelayout

2、点击跳转的对应actionStartActivity方法,实际是返回一个Action对象 通过GlanceModifier.clickable(actionStartActivity(MainActivity::class.java))进行对应跳转

除了activity外,还能启动Service,BoardCast,详见此文档处理用户互动 | Jetpack Compose | Android Developers

3、关于背景圆角的方法,目前采用Box里面套一个Image和具体内容实现,Image去加载我们drawable里的矢量图对象(shape的那种)来实现

4、remember在里面可用,但如果结合animateColorAsState这种动画效果,实际上并没有效果(只是单纯的变更,没有中间过渡过程)

class MyAppWidgetReceiver : GlanceAppWidgetReceiver() {
    //MyAppWidget里就是类似我们remoteview的创建
    override val glanceAppWidget: GlanceAppWidget = MyAppWidget()
}

class MyAppWidget : GlanceAppWidget() {

    override suspend fun provideGlance(context: Context, id: GlanceId) {

        // In this method, load data needed to render the AppWidget.
        // Use `withContext` to switch to another thread for long running
        // operations.
        provideContent {
            val upSpeed by DataRespotiy.upSpeed.asFlow().collectAsState(initial = 0L)
            val downloadSpeed by DataRespotiy.downloadSpeed.asFlow().collectAsState(initial = 0L)

            Box(GlanceModifier.fillMaxSize()) {
                Image(provider = ImageProvider(R.drawable.app_widget_bg), contentDescription = null, modifier = GlanceModifier.fillMaxSize())

                Column(GlanceModifier.fillMaxSize()) {
                    Spacer(GlanceModifier.height(28.dp))
                    Row(GlanceModifier.fillMaxWidth().padding(horizontal = 20.dp)) {
                        androidx.glance.Image(provider = ImageProvider(R.mipmap.logo), contentDescription = null, modifier = GlanceModifier.size(108.dp))

                        Spacer(modifier = GlanceModifier.width(24.dp))
                        Column(GlanceModifier.defaultWeight()) {
                            Row(modifier = GlanceModifier.wrapContentHeight(), horizontalAlignment = Alignment.End, verticalAlignment = Alignment.Vertical.CenterVertically) {
                                Text(text = "${upSpeed} Kb/s", style = TextStyle(color = ColorProvider(APP_Primary_color), fontSize = 22.sp))
                                Spacer(modifier = GlanceModifier.width(4.dp))
                                androidx.glance.Image(provider = ImageProvider(R.drawable.icon_upload_widget), contentDescription = null, modifier = GlanceModifier.size(32.dp))
                            }

                            Spacer(modifier = GlanceModifier.height(18.dp))

                            Row(modifier = GlanceModifier, horizontalAlignment = Alignment.End, verticalAlignment = Alignment.Vertical.CenterVertically) {
                                Text(text = "${downloadSpeed} Kb/s", style = TextStyle(color = ColorProvider(APP_Bigfile_color), fontSize = 22.sp))
                                Spacer(modifier = GlanceModifier.width(4.dp))
                                androidx.glance.Image(provider = ImageProvider(R.drawable.icon_down_widget), contentDescription = null, modifier = GlanceModifier.size(32.dp))
                            }
                        }
                    }
                    Spacer(GlanceModifier.height(28.dp))

                    Box(modifier = GlanceModifier.fillMaxWidth().defaultWeight()) {
                        Image(provider = ImageProvider(R.drawable.app_widget_bg1), contentDescription = null, modifier = GlanceModifier.fillMaxSize())
                        Row(
                            modifier = GlanceModifier.fillMaxSize()
                                .padding(horizontal = 20.dp,16.dp), horizontalAlignment = Alignment.CenterHorizontally
                        ) {
                            val modifier = GlanceModifier.defaultWeight()
                            //todo 不同的item类型
                            repeat(3) { index ->
                                Row(modifier, horizontalAlignment = Alignment.CenterHorizontally, verticalAlignment = Alignment.Vertical.CenterVertically) {
                                    androidx.glance.Image(
                                        provider = ImageProvider(R.drawable.icon_net_test), contentDescription = null, modifier = GlanceModifier
                                            .size(108.dp)
                                            .clickable(actionStartActivity(MainActivity::class.java))
                                    )
                                }

                                Spacer(GlanceModifier.width(20.dp))
                            }

                        }
                    }


                }
            }

        }
    }
}

其他补充

更新小组件方法:

val manager = GlanceAppWidgetManager(application)
val widget = MyAppWidget()
val glanceIds = manager.getGlanceIds(widget.javaClass)

glanceIds.forEach { glanceId ->
	widget.update(application, glanceId)
}

//第二种方式(实际上和上面的方法是一样的,下面这个是官方给我们封装的另外个方法)
MyAppWidget().updateAll(application)

文章转载自:Stars-one

原文链接:Jetpack架构组件学习(6)——使用Glance实现桌面小组件 - Stars-one - 博客园

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构


http://www.kler.cn/a/523057.html

相关文章:

  • unity实现回旋镖函数
  • C++二叉树进阶
  • windows lm studio 0.3.8无法下载模型,更换镜像
  • 探秘 TCP TLP:从背景到实现
  • 30. C语言 动态内存管理详解:从malloc到realloc
  • 《STL基础之vector、list、deque》
  • 相互作用感知的蛋白-小分子对接模型 - Interformer 评测
  • 算法题(50):删除排序链表中的重复元素 II
  • ML基础——分类模型的评估指标
  • STM32 TIM定时器配置
  • 虚幻基础08:组件接口
  • 在ubuntu下一键安装 Open WebUI
  • 能够对设备的历史数据进行学习与分析,通过与设备当前状态的比对,识别潜在故障并做出预判的名厨亮灶开源了。
  • 宝塔安装完redis 如何访问
  • 信息学奥赛一本通 1396:病毒(virus)
  • c++多态
  • JavaScript逆向高阶指南:突破基础,掌握核心逆向技术
  • Nginx 开发总结
  • 《网络数据安全管理条例》施行,企业如何推进未成年人个人信息保护(上)
  • 深入探索C++17的std::any:类型擦除与泛型编程的利器
  • STM32 LED呼吸灯
  • pycharm(2)
  • noteboolm 使用笔记
  • 面向对象编程简史
  • Facebook如何应对全球范围内的隐私保护挑战
  • Python vLLM 实战应用指南