更新您的 widget 以适配 Android 12

更新您的 widget 以适配 Android 12
www.zeeklog.com  - 更新您的 widget 以适配 Android 12

很长一段时间来,微件 (widget) 一直是 Android 用户体验的核心组成部分,很多应用通过微件来提升用户黏度。用户乐于使用微件的原因是可以在不打开应用的情况下使用应用功能,且可自定义设备的主屏幕。

Android 12 更新了已有的 Widget API,重塑了微件的设计来契合 "Material You" 设计语言。这些更新可以帮助您使用设备的主题颜色和圆角来构建更加美观的微件,从而提升微件在搜索和摆放时的可发现性和视觉观感。

www.zeeklog.com  - 更新您的 widget 以适配 Android 12

△ 对比更新之前 (Android 11) 和更新后的浅色和深色主题 (Android 12)

  • Material You
    https://material.io/blog/announcing-material-you

在这个系列中,我们将带您更新微件来适配 Android 12。在本文中我们将进行一些简单的修改,使您的微件能够在 Android 12 的设备上看起来更加精致,且在较旧版本的设备中提供一致的用户体验。在第二篇文章中,我们将了解新的 API,通过它们可以使微件更加个性化、响应更灵敏并且更具互动性。

视觉变化

对于用户来说,毫无疑问最直观的视觉变化是风格和设计上的改变。更新可视元素,比如颜色和圆角,呈现出的外观会令用户耳目一新。增加这些修改,我们推荐您创建一个自定义的主题。

增加动态颜色

Material You 旨在提供更加个性化的用户体验。在 Android 12 中,动态颜色可以使您的微件与其它微件以及系统保持一致的风格。微件可以使用系统默认的主题 Theme.DeviceDefault.DayNight,并且在微件的 UI 元素中使用主题颜色属性。

△ Material Design 更新一览

  • 腾讯视频链接
    https://v.qq.com/x/page/l3248jb7ktt.html
  • Bilibili 视频链接
    https://www.bilibili.com/video/BV13V41177zj/

对于 SDK 级别低于 31 的设备,您需要创建一个继承自 DeviceDefault 的自定义主题。

values/themes.xml
<style name="Theme.AppWidget.AppWidgetContainer"
   parent="@android:style/Theme.DeviceDefault" />

对于 SDK 级别为 31 的设备,使用主题 DeviceDefault.DayNight 来创建自定义主题。

values-v31/themes.xml
<style name="Theme.AppWidget.AppWidgetContainer" 
   parent="@android:style/Theme.DeviceDefault.DayNight" />
  • values/themes.xml
    https://github.com/android/user-interface-samples/blob/main/AppWidget/app/src/main/res/values/themes.xml
  • values-v31/themes.xml
    https://github.com/android/user-interface-samples/blob/main/AppWidget/app/src/main/res/values-v31/themes.xml
或者,如果您的应用使用了 ,您可以使用 Theme.MaterialComponents.DayNight 作为基础主题,而不是使用 Theme.DeviceDefault。

为了能够让您的微件可以动态适配系统颜色,您可以将该主题配置到您的微件上,并且在微件的其它视图上使用主题颜色属性。

layout/widget_checkbox_list_title_region.xml
...
<TextView android:id="@+id/checkbox_list_title"
   android:layout_width="0dp"
   android:layout_height="wrap_content"    
   android:layout_gravity="center_vertical"
   android:layout_marginStart="8dp"
   android:layout_weight="1"
   android:text="@string/grocery_list"
   android:textColor="?android:attr/textColorPrimary" />
<ImageButton
   android:layout_width="@dimen/widget_element_min_length"
   android:layout_height="@dimen/widget_element_min_length"
   android:background="?android:attr/selectableItemBackground"
   android:clickable="true"
   android:contentDescription="@string/add_button_grocery_list_content_description"
   android:src="@drawable/ic_add_24"
   android:tint="?android:attr/colorAccent" />
...
  • layout/widget_checkbox_list_title_region.xml
    https://github.com/android/user-interface-samples/blob/main/AppWidget/app/src/main/res/layout/widget_checkbox_list_title_region.xml
www.zeeklog.com  - 更新您的 widget 以适配 Android 12

△ 在浅色/深色主题中静态颜色与动态颜色的对比

圆角

从 Android 12 开始,圆角将自动应用于微件。这也意味着圆角会裁剪微件的部分内容。为了避免出现这样的问题,并且提供与其它微件和系统风格一致的外观和用户体验,您可以使用 system_app_widget_background_radius 在微件的背景添加圆角,使用 system_app_widget_inner_radius 在微件中的视图添加圆角。后者的值需要比 system_app_widget_background_radius 小 8dp。

  • system_app_widget_background_radius
    https://developer.android.google.cn/reference/android/R.dimen#system_app_widget_background_radius
  • system_app_widget_inner_radius
    https://developer.android.google.cn/reference/android/R.dimen#system_app_widget_inner_radius

在添加上述修改时,请注意如果您的微件包含靠近角区域的内容,这些内容可能会被裁减掉。要解决该问题,您需要添加足够大的 padding 来避免微件的内容与圆角之间的冲突。

values/attrs.xml
<declare-styleable name="AppWidgetAttrs">
   <attr name="appWidgetPadding" format="dimension" />   
   <attr name="appWidgetInnerRadius" format="dimension" />
   <attr name="appWidgetRadius" format="dimension" />
</declare-styleable>
values/themes.xml
<style name="Theme.AppWidget.AppWidgetContainerParent"
   parent="@android:style/Theme.DeviceDefault">
<!-- 微件的外轮廓的圆角半径 -->
   <item name="appWidgetRadius">16dp</item>
<!-- widget 内部视图边缘的圆角半径。它的值为 8 dp 或者小于 appWidgetRadius  -->
   <item name="appWidgetInnerRadius">8dp</item>
</style>
<style name="Theme.AppWidget.AppWidgetContainer"
   parent="Theme.AppWidget.AppWidgetContainerParent">
 <!-- 增加 padding 来避免微件的内容与圆角冲突 -->
   <item name="appWidgetPadding">16dp</item>
</style>
values-v31/themes.xml
<style name="Theme.AppWidget.AppWidgetContainerParent"
   parent="@android:style/Theme.DeviceDefault.DayNight">
   <item name="appWidgetRadius">
       @android:dimen/system_app_widget_background_radius</item>     
   <item name="appWidgetInnerRadius">
       @android:dimen/system_app_widget_inner_radius</item>
</style>
values/styles.xml
<style name="Widget.AppWidget.AppWidget.Container"
   parent="android:Widget">
   <item name="android:id">@android:id/background</item>
   <item name="android:background">
       ?android:attr/colorBackground</item>
</style>
  • values/attrs.xml
    https://github.com/android/user-interface-samples/blob/main/AppWidget/app/src/main/res/values/attrs.xml
  • values/themes.xml
    https://github.com/android/user-interface-samples/blob/main/AppWidget/app/src/main/res/values/themes.xml
  • values-v31/themes.xml
    https://github.com/android/user-interface-samples/blob/main/AppWidget/app/src/main/res/values-v31/themes.xml
  • values/styles.xml
    https://github.com/android/user-interface-samples/blob/main/AppWidget/app/src/main/res/values/styles.xml
如果您的 minTargetSDK 小于 21,那么您需要提供适用于 SDK 版本 21 的 style,因为在可绘制对象上使用 android:attr/colorBackground 需要 SDK 版本至少为 21。
  • 可绘制对象
    https://developer.android.google.cn/guide/topics/graphics/drawables

至此您已经创建了主题,现在可以在微件的布局上设置样式了。

layout/widget_grocery_list.xml
<LinearLayout
   style="@style/Widget.AppWidget.AppWidget.Container">
   ...
</LinearLayout>
  • layout/widget_grocery_list.xml
    https://github.com/android/user-interface-samples/blob/main/AppWidget/app/src/main/res/layout/widget_grocery_list.xml
www.zeeklog.com  - 更新您的 widget 以适配 Android 12

△ 对比原有风格、自动圆角效果以及带有圆角和 padding 的效果

过渡

当应用通过微件打开时,Android 12 提供了过渡效果。该过渡效果是由系统自动处理的,并且在旧版本的 Android 上不会出现。要启用该效果,您需要在微件布局根元素上指定一个 id,并设置它的值为 android:id/background。

<LinearLayout
   android:id="@android:id/background">
   ...
</LinearLayout>
www.zeeklog.com  - 更新您的 widget 以适配 Android 12

△ 过渡效果的慢放动画

如果您的微件使用了 broadcast trampoline,也就是说您的微件在用户点击时创建了 PendingIntent,通过广播或者服务启动 Activity,那么在这种情况下,该过渡动画不会生效。

  • broadcast trampoline
    https://developer.android.google.cn/about/versions/12/behavior-changes-12?hl=ca#notification-trampolines

微件选择器的优化

预览

Android 12 包含新的经过改进的微件选择器。与使用静态可绘制资源不同,新的微件选择器使用 XML 布局来动态创建缩放的微件预览。

如果您的微件并不包含动态元素,比如 ListView 或者 GridView,您可以使用微件的布局实现预览。

要实现预览,您需要将默认值直接设置到原始布局上。

<TextView
   style="@style/Widget.AppWidget.Checkbox"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="@string/widget_title_preview" />
<TextView
   style="@style/Widget.AppWidget.Checkbox"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="@string/widget_subject_preview" />

在布局上设置默认值可能会带来少量的延迟,因为占位的值会在实际值之前首先被启用。要避免该问题,您可以为预览创建一个独立的布局文件,并且启用自定义的预览主题。

<resources>
   <!-- 声明属性-->
   <attr name="widgetTitlePreview" format="string" />
   <attr name="widgetSubjectPreview" format="string" />
   <!-- 声明 style -->
   <style name="Theme.MyApp.Widget"
       parent="@style/Theme.DeviceDefault.DayNight.AppWidget">
       <item name="widgetTitlePreview"></item>
       <item name="widgetSubjectPreview"></item>
</style>
   <style name="Theme.MyApp.Widget.Preview">
       <item name="widgetTitlePreview">Preview Title</item>
       <item name="widgetSubjectPreview">Preview Subject</item>
</style>
</resources>

创建预览主题后,您可以在布局中将它应用到预览元素上。

layout/my_widget_preview.xml
<LinearLayout ...>
   <include layout="@layout/widget_header"
        android:theme=”@style/Theme.MyApp.Widget.Preview” /></LinearLayout>
layout/my_widget_actual.xml
<LinearLayout ...>
   <include layout="@layout/widget_header"
       android:theme=”@style/Theme.MyApp.Widget” />
</LinearLayout>

最后,您需要将微件的布局设置为 appwidget-provider 的 previewLayout 属性。

xml/app_widget_info_checkbox_list.xml
<appwidget-provider
   android:previewLayout="@layout/widget_grocery_list"
   ...
/>
  • xml/app_widget_info_checkbox_list.xml
    https://github.com/android/user-interface-samples/blob/main/AppWidget/app/src/main/res/xml/app_widget_info_checkbox_list.xml
www.zeeklog.com  - 更新您的 widget 以适配 Android 12

△ 对比静态预览效果与缩放预览效果

对于显示多个元素的 ListView、GridView 或者 Stack,是无法直接在布局上设置默认值的。对于这些视图,您可以为微件预览创建另一个布局,并且在布局中设置固定的值。

要实现上述操作,推荐的最佳实践是使用 <include> 标签来复用布局的一部分以启用默认值,而无需复制整个布局。您可以将新的布局设置为 appwidget-provider 的 previewLayout 属性。

描述

您也可以设置 description 属性作为描述信息显示在微件选择器上。虽然这是可选项,但是提供描述信息可以帮助用户更好地了解微件的功能。

app_widget_info_checkbox_list.xml
<appwidget-provider
  android:description="@string/app_widget_grocery_list_description"
  ...
/>
www.zeeklog.com  - 更新您的 widget 以适配 Android 12

△ 微件描述

总结

在本文中,我们为您展示了如何更新微件设计并且在微件选择器中提供更好的用户体验。上述内容可以快速更新您的微件来适配 Android 12,您的用户可以看到非常直观的区别。

但这并不是全部。在下一篇文章中,我们将会了解新的 API,它可以使您的微件更加个性化,响应更灵敏且更具互动性。

欢迎您通过下方二维码向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!

www.zeeklog.com  - 更新您的 widget 以适配 Android 12

推荐阅读

如页面未加载,请刷新重试

www.zeeklog.com  - 更新您的 widget 以适配 Android 12

点击屏末 | 阅读原文 | 即刻了解更多关于 Android 12 微件改进


www.zeeklog.com  - 更新您的 widget 以适配 Android 12
www.zeeklog.com  - 更新您的 widget 以适配 Android 12
www.zeeklog.com  - 更新您的 widget 以适配 Android 12

Read more

60个“特征工程”计算函数(Python代码)

60个“特征工程”计算函数(Python代码)

转自:coggle数据科学 近期一些朋友询问我关于如何做特征工程的问题,有没有什么适合初学者的有效操作。 特征工程的问题往往需要具体问题具体分析,当然也有一些暴力的策略,可以在竞赛初赛前期可以带来较大提升,而很多竞赛往往依赖这些信息就可以拿到非常好的效果,剩余的则需要结合业务逻辑以及很多其他的技巧,此处我们将平时用得最多的聚合操作罗列在下方。 最近刚好看到一篇文章汇总了非常多的聚合函数,就摘录在下方,供许多初入竞赛的朋友参考。 聚合特征汇总 pandas自带的聚合函数 * 其它重要聚合函数 其它重要聚合函数&分类分别如下。 def median(x):     return np.median(x) def variation_coefficient(x):     mean = np.mean(x)     if mean != 0:         return np.std(x) / mean     else:         return np.nan def variance(x):     return

By Ne0inhk
90w,确实可以封神了!

90w,确实可以封神了!

要说24年一定最热的技术,还得是AIGC! 前段时间阿里旗下的开源项目,登上GitHub热榜! AI大热,如今ChatGPT的优异表现,必然会出现各种细分场景应用的工具软件,和大量岗位项目! 山雨欲来风满楼,强人工智能的出现,所有科技公司已经开始巨量扩招此领域的人才。算法的岗位,近三个月已经增长68%!这件事在HR届也是相当震撼的。 目前各行各业都不景气的市场,人工智能岗位却一直保持常青!甚至同属AI边缘岗都比其他岗薪资高40%! 与此同时,AI算法岗上岸也不简单,竞争激烈,好公司核心岗位不用说,谁都想去。 所以事实就是,想要上岸,门槛也逐渐变高,项目经历、实习经历都很重要,越早明白这个道理就越能提前建立起自己的优势。 但我在b站逛知识区的时候,经常看到有些同学,因为一些客观原因导致无法参加实习,这种情况下,如果你想提升背景,增加项目经历的话,可以试试这个《CV/NLP 算法工程师培养计划》。 目前已经有上千位同学通过该计划拿到offer了,最新一期学员就业薪资最高能拿到78K!年薪94w! 优势就是有BAT大厂讲师带领,手把手带做AI真实企业项目(包含CV、NLP等

By Ne0inhk
再见nohup!试试这个神器,Python Supervisor!

再见nohup!试试这个神器,Python Supervisor!

👇我的小册 45章教程:() ,原价299,限时特价2杯咖啡,满100人涨10元。 作者丨Ais137 https://juejin.cn/post/7354406980784373798 1. 概述 Supervisor 是一个 C/S 架构的进程监控与管理工具,本文主要介绍其基本用法和部分高级特性,用于解决部署持久化进程的稳定性问题。 2. 问题场景 在实际的工作中,往往会有部署持久化进程的需求,比如接口服务进程,又或者是消费者进程等。这类进程通常是作为后台进程持久化运行的。 一般的部署方法是通过 nohup cmd & 命令来部署。但是这种方式有个弊端是在某些情况下无法保证目标进程的稳定性运行,有的时候 nohup 运行的后台任务会因为未知原因中断,从而导致服务或者消费中断,进而影响项目的正常运行。 为了解决上述问题,通过引入 Supervisor 来部署持久化进程,提高系统运行的稳定性。 3. Supervisor 简介 Supervisor is a client/

By Ne0inhk
第一本给程序员看的AI Agent图书上市了!

第一本给程序员看的AI Agent图书上市了!

AI Agent火爆到什么程度? OpenAI创始人奥特曼预测,未来各行各业,每一个人都可以拥有一个AI Agent;比尔·盖茨在2023年层预言:AI Agent将彻底改变人机交互方式,并颠覆整个软件行业;吴恩达教授在AI Ascent 2024演讲中高赞:AI Agent是一个令人兴奋的趋势,所有从事AI开发的人都应该关注。而国内的各科技巨头也纷纷布局AI Agent平台,如:钉钉的AI PaaS、百度智能云千帆大模型平台等等。 Agent 是未来最重要的智能化工具。对于程序员来说,是时候将目光转向大模型的应用开发了,率先抢占AI的下一个风口AI Agent。 小异带来一本新书《大模型应用开发 动手做 AI Agent》,这本书由《GPT图解》的作者黄佳老师创作,从0到1手把手教你做AI Agent。现在下单享受5折特惠! ▼点击下方,即可5折起购书 有这样一本秘籍在手,程序员们这下放心了吧,让我们先来揭开 Agent 的神秘面纱。 AI Agent 面面观

By Ne0inhk