Android-桌面小组件RemoteViews播放动画

news2025/1/15 17:52:26

一、前言

前段时间什么比较火?当然是木鱼了,木鱼一敲,烦恼全消~在这个节奏越来越快的社会上,算是一个不错的解压利器!

我们也紧跟时事,推出了  我要敲木鱼(各大市场均可以下载哦~)

咳咳,扯远了,说回正题

我们在后台收到大量反馈,说是希望添加桌面组件敲木鱼功能。好嘛,用户的话就是圣旨,那必须要安排上,正好我也练练手。

老规矩,先来看下我实现的效果

 这个功能看着很简单对吧,却也花了我一天半的时间。主要用来实现敲击动画了!!

二、代码实现

1、新建小组件

 2、修改界面样式

主要会生成3个关键文件(文件名根据你设置的来)
①、APPWidget  类,继承于 AppWidgetProvider,本质是一个 BroadCastReceiver

②、layout/widget.xml ,小组件布局文件

③、xml/widget_info.xml ,小组件信息说明文件

同时会在 AndroidManifest中注册好

类似如下代码:

     <receiver
            android:name=".receiver.MuyuAppWidgetBig"
            android:exported="false">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                <action android:name="com.fyspring.bluetooth.receiver.action_appwidget_muyu_knock" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/app_widget_info_big" />
        </receiver>

3、添加敲木鱼逻辑代码

通过 APPWidget 的模板代码我们知道,内部通过 RemoteViews 来进行更新View,而我们都知道 RemoteViews 是无法通过 findViewById 来转成对应的 view,更无法对其添加 Animator。那么我们该怎么办来给桌面木鱼组件添加一个 缩放动画呢?

给你三秒时间考虑下,这里我可花了一天时间来研究....

通过 layoutAnimation !!!

layoutAnimation 是在 ViewGroup 创建之后,显示时作用的,作用时间是:ViewGroup 的首次创建显示,之后再有改变就不行了。

虽然 RemoteViews 不能执行 findViewById,但它提供了两个关键方法: remoteViews.removeAllViews  和  remoteViews.addView 。如果我们在点击时,向组件布局中添加一个带有 layoutAnimation 的布局,不是就可以间接播放动画了么?

关键代码:

private fun doAnimation(context: Context?, remoteViews: RemoteViews?) {
        remoteViews?.removeAllViews(R.id.muyu_rl)
        val remoteViews2 = RemoteViews(context?.packageName, R.layout.anim_layout)
        remoteViews2.setImageViewResource(R.id.widget_muyu_iv, R.mipmap.ic_muyu)
        remoteViews?.addView(R.id.muyu_rl, remoteViews2)
    }

小组件布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/Widget.BlueToothDemo.AppWidget.Container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/shape_round_bg"
    android:theme="@style/Theme.BlueToothDemo.AppWidgetContainer">

    <LinearLayout
        android:layout_width="140dp"
        android:layout_height="140dp"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <TextView
            android:id="@+id/appwidget_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:contentDescription="测试桌面木鱼"
            android:text="已敲0次"
            android:textColor="@color/white"
            android:textSize="18sp"
            android:textStyle="bold" />

        <RelativeLayout
            android:id="@+id/muyu_rl"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/widget_muyu_iv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerHorizontal="true"
                android:layout_margin="15dp"
                android:src="@mipmap/ic_muyu" />

        </RelativeLayout>
    </LinearLayout>
</RelativeLayout>

添加替换的动画布局(anim_layout.xml),注意两边的木鱼ImgView 的 ID保持一致,因为要统一设置点击事件!!

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layoutAnimation="@anim/muyu_anim">

    <ImageView
        android:id="@+id/widget_muyu_iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_muyu2" />
</RelativeLayout>

动画文件:(muyu_anim.xml)

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" 
android:animation="@anim/scale_anim"/>

动画文件:(scale_anim.xml)

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="100"
    android:fromXScale="0.9"
    android:fromYScale="0.9"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1"
    android:toYScale="1" />

关键动画代码就是以上这些,如果有问题欢迎私信。希望大家在新的一年里,木鱼一敲,烦恼全消~

欢迎体验下我做的木鱼,记得搜  我要敲木鱼  哦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Conv2Former: A Simple Transformer-Style ConvNet for Visual Recognition

论文: https://arxiv.org/pdf/2211.11943.pdf code(pytorh版本): https://github.com/shanglianlm0525/PyTorch-Networks Conv2Former: A Simple Transformer-Style ConvNet for Visual Recognition一、引言二、架构实现(一)、Convolutional Modulation Block&#xff08;二&am…

ICV:车载毫米波雷达市场有望在2023年突破45亿美元!

全球前沿科技咨询机构ICV近期发布了全球车载毫米波雷达的市场分析报告&#xff0c;ICV在报告中表示毫米波角雷达的渗透率有较大上升空间&#xff0c;另外MMIC装配数量的提升可能会是毫米波雷达当前一个主要的技术发展趋势。 本报告旨在评估车载毫米波雷达的市场情况&#xff0c…

vue3路由切换过渡动画实现(含有一些坑)

今天写项目的准备收尾的时候&#xff0c;想给路由组件切换给一个过渡效果。在开发的过程中遇到一些坑。 1.Vue2和Vue3区别 vue2 <transition :name"transitionName"> <router-view></router-view> </transition> 后面就是写样式 Vue3 …

旅游网项目

技术选型 JAVA版本&#xff1a;JDK11数据库&#xff1a;Mysql5.7Navicat后端框架&#xff1a;SpringBoot2.7.1 SpringMVC Mybatis-Plus3.5.0权限控制&#xff1a;SpringSecurity前端框架&#xff1a;AdminLTE2模板引擎&#xff1a;Thymeleaf工具类&#xff1a;发邮件工具类、…

一分钟玩转RPA——word批量转pdf

大家好&#xff0c;我是无用兄&#xff0c;批量word转pdf文件我们在工作中有时会经常遇到&#xff0c;网上也有很多工具&#xff0c;有收费的也有免费的&#xff0c;今天我们主要介绍下如何用影刀RPA工具只需要四条指令就可以完成这个工作&#xff0c;而且后续的使用是完全免费…

解决原 Unique Key 模型存在的问题

为了解决原 Unique Key 模型存在的问题&#xff0c;以更好的满足业务场景的需求&#xff0c;我们决定对 Unique Key 模型进行优化&#xff0c;针对读写效率问题的优化方案展开了详细的调研。 关于以上问题的解决方案&#xff0c;业内已经有了较多的探索。代表性的有三类&#…

数据库MYSQL及MYSQL ODBC

文章目录MYSQL下载安装MYSQL操作赋权添加ODBC数据源手动配置命令行配置Wdac: Add-OdbcDsnodbcconf.exe其它方案64位机器上调用32位ODBCwarning & problemString data, right truncation迁移sql server数据库到mysqlSQL SERVER链接mysqlwarningMysql TIMESTAMP VS DATETIMEM…

【设计模式】我终于读懂了装饰者模式。。。

文章目录&#x1f451;星巴克咖啡订单项目&#xff08;咖啡馆&#xff09;&#x1f452;装饰者模式定义&#x1f45e; 装饰者模式解决星巴克咖啡订单&#x1f302;装饰者模式下的订单&#xff1a;2 份巧克力一份牛奶的 LongBlack&#x1f4bc;下面我们跟着代码debug下去看一下&…

五、Kubernetes命令行工具 (kubectl)

1、概述 kubectl 是 Kubernetes 集群的命令行工具&#xff0c;通过 kubectl 能够对集群本身进行管理&#xff0c;并能 够在集群上进行容器化应用的安装部署。 2、语法 使用以下语法从终端窗口运行 kubectl 命令&#xff1a; kubectl [command] [TYPE] [NAME] [flags] 其中 …

PPCNN

这是细粒度特征提取和定位用于目标检测&#xff0c;近年来&#xff0c;深度卷积神经网络在计算机视觉上取得了优异的性能。深度卷积神经网络以精确地分类目标信息而闻名&#xff0c;并采用了简单的卷积体系结构来降低图层的复杂性&#xff0c;基于深度卷积神经网络概念设计的VG…

二叉树遍历

题目&#xff1a;二叉树的遍历 解法一&#xff1a;递归遍历&#xff0c;也是实现起来&#xff0c;最简单的方式。 写递归算法的核心三大要素&#xff1a;1.确定递归函数的参数 和 返回值。都是关键的信息。 2.确定终止条件。用心思考&#xff0c;到底啥才是本次递归终止的条件…

keras的模型可视化

参考&#xff1a;https://blog.csdn.net/chenxy_bwave/article/details/121955478 from tensorflow.keras import utils utils.plot_model(model, model_cnnppt.png,show_shapesTrue,show_dtypeTrue,show_layer_namesTrue)两行代码&#xff0c;效果惊艳。 但是这样也有一个弊…

酒店好评回复模板

网评是酒店线上口碑的体现&#xff0c;好评率高可以提高客户入住率&#xff0c;而酒店对网评的回复也很关键&#xff0c;酒店要重视好评的回复。 前言 住酒店存在于在我们日常生活的很多场景中&#xff0c;比如&#xff1a;旅游入住酒店、出差办公也会入住酒店等等&#xff0c…

【NumPy 数组过滤、NumPy 中的随机数、NumPy ufuncs】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…

rabbitmq基础5——集群节点类型、集群节基础运维,集群管理命令

文章目录一、集群节点类型1.1 内存节点1.2 磁盘节点二、集群基础运维2.1 剔除单个节点2.1.1 集群正常踢出正常节点2.1.2 服务器异常宕机踢出节点2.1.3 集群正常重置并踢出节点2.2 集群节点版本升级2.3 集群某单节点故障恢复2.3.1 机器硬件故障2.3.2 机器掉电2.3.3 网络故障2.3.…

WPF使用快捷键 资源 输入快捷键与资源绑定 资源绑定调用操作 或keydown处理

winform直接&D就OK,还是没有winform方便。 方式1&#xff1a; 资源 输入快捷键与资源绑定 资源绑定调用操作 <Window.Resources><RoutedUICommand x:Key"download" Text"download"/></Window.Resources><Window.InputBindings>…

现在的时代不是互联网时代的延续,因为其底层逻辑已经改变

拥抱实体经济&#xff0c;绝对是当下互联网玩家们的首要选择。无论是头部的互联网企业来讲&#xff0c;还是新生的互联网玩家而言&#xff0c;它们都不约而同地将关注的焦点聚焦在了这样一个方向上。   透过这一点&#xff0c;我们可以非常明显地感受到&#xff0c;一个全新的…

Rust 语言的全链路追踪库 tracing

在一个应用程序或库的开发过程中&#xff0c;除了其本身的逻辑以外&#xff0c;开发人员还需要做很多额外的工作&#xff0c;以保证编写的代码可以正确的运行&#xff0c;或者在出错时可以快速定位到错误的位置以及原因&#xff0c;这就需要引入一些额外的工具&#xff0c;trac…

Verilog刷题HDLBits——Exams/ece241 2014 q5a

Verilog刷题HDLBits——Exams/ece241 2014 q5a题目描述代码结果题目描述 You are to design a one-input one-output serial 2’s complementer Moore state machine. The input (x) is a series of bits (one per clock cycle) beginning with the least-significant bit of …

HistoSeg:具有多损失函数的快速注意,用于数字组织学图像中的多结构分割

摘要 大多数分割网络都是基于编解码的网络结构&#xff0c;也利用了复杂的注意力模块或者Trasnsformer模块。但是这些网络在捕获相关的局部和全局特征时还不够准确。无法在多个尺度上进行准确的边界检测。因此&#xff0c;我们提出了一个编码器-解码器网络&#xff0c;快速注意…