【Android小知识点】Widget中实现动画的一种极简方式

前言


Android中的Widget俗称桌面小部件;大家可能用的不多,因为除了系统应用的Widget可能会默认显示在桌面;其他第三方安装的应用都需要你长按桌面,然后点击添加小部件,选择一个放到桌面才能使用。这种手动的方式对用户来讲比较麻烦,用的很少。所以Android原生对Widget的支持其实是比比较弱的,只能显示部分系统原生的View。但是这并不能阻挡我们这些拥有发散思维而不懂技术开发的产品们。就是要在Widget上展示一些动画,所以有了此文。What?说了半天,你不知道什么是Widget,那就上吧,看图说话。

 

【Android小知识点】Widget中实现动画的一种极简方式_第1张图片

 

背景


好吧,刚刚说的那种思维发散不懂技术的产品我就有一个;在车载中控系统的FM本地收音机模块中,在收音机进行播放的时候,桌面上会有一个地方显示收音机的控制面板也就是类似上面音乐应用的Widget了。这都不重要,重要的是,需要在收音机播放的时候Widget上面有一个动态的柱状图的小频谱进行跳动显示。居然还要根据音乐频率变化跳动,在我以死相逼的胁迫下他妥协了,但是至少要随机跳动。

因涉及到项目素材就画个模型图给大家想想一下

【Android小知识点】Widget中实现动画的一种极简方式_第2张图片

 

调研


Widget实现动画的常见方式:

1- 自定义View,如果你不能对Framework进行编译,并且是运行在定制的机器上。对不起,不支持。Widget只支持原生的部分View显示。反之,是可行的,可以百度下,有大牛写了步骤。

2- 使用xml动画,widget是支持LayoutAnimation的;但是这是在布局加载进来的时候会调用,该动画需要一直重复怎么办,一直切换布局?是否太影响性能。

3- 帧动画,可是获取不到View,该如何启动帧动画呢?

4- 在Widget中使用Handler延时循环更新Widget来刷新,这样是可以实现的,可是性能上有没有更好的方法呢?

5- 同4差不多,使用JobScheduler的方式定时刷新Widget来实现。问题也是性能上,但是可以作为备用方案实现复杂的动画。

6- (本次推荐)使用ProgressBar的方式实现,Widget是支持原生ProgressBar的显示的。

 

思考


我们常用的ProgressBar的样式有两种。第一种是进度条样式,第二种是一直转圈的模式,表示正在Loading;想想我们一般是如何使用这两种样式的,是不是在xml中通过使用不同Style去显示不同的样式。那么能不能通过设置不同的Style来展示我们想要的图片的动画呢?答案是可以的,这样的话动画就由原生的Progress内部帮我们实现了,我们只需要结合xml动画的方式给他设置Sytle 就能实现我们想要的动画效果了。

【Android小知识点】Widget中实现动画的一种极简方式_第3张图片

 

使用


默认你已经知道如何创建和基本使用一个Widget了。所以,首先要在Widget的布局中添加一个原生的ProgressBar;

1- 添加ProgressBar

      android:id="@id/prgress"      style="@style/animFMStyle"      android:layout_width="wrap_content"      android:layout_height="wrap_content" />

 

2- 添加animFMStyle


3- 在drawable中添加帧动画的xml文件

  xmlns:android="http://schemas.android.com/apk/res/android">               

android:oneshot="false" 表示是否只是运行一次,false代表一直循环执行。好了,让我Build -> install apk;  搞起,看!

【Android小知识点】Widget中实现动画的一种极简方式_第4张图片

 

 

总结


这个小知识点,到这里就结束了。有没有效果就需要自己去尝试了,有朋友可能会问,暂停的时候如何停止动画,不好意思停不了,再来个View交替显示吧,一个动画的,一个不禁止的。感谢大家,如有疑问请在下方留言。

 

你可能感兴趣的:(Android-随笔知识)