【Rive】Android与Rive交互

news/2025/3/12 23:58:21/文章来源:https://www.cnblogs.com/zhyan8/p/18621013

1 Android与Rive交互的常用接口

1.1 RiveAnimationView参数

<app.rive.runtime.kotlin.RiveAnimationViewandroid:id="@+id/rive_view"android:layout_width="match_parent"android:layout_height="match_parent"android:adjustViewBounds="true"app:riveAnimation="rive_anim"app:riveArtboard="rive_artboard"app:riveResource="@raw/rive_res"<!--加载网络资源app:riveUrl="https://cdn.rive.app/animations/vehicles.riv"-->app:riveStateMachine="State Machine 1" />

1.2 Inputs交互

​ Android 中可以通过 RiveAnimationView 控制动画状态机的状态切换,也可以控制混合动画的混合比例变化。

// 激活触发器
fun fireState(stateMachineName: String, inputName: String)
// 修改Boolean变量的值
fun setBooleanState(stateMachineName: String, inputName: String, value: Boolean)
// 修改Number变量的值
fun setNumberState(stateMachineName: String, inputName: String, value: Float)

1.3 文本操作

​ Android 中可以通过 RiveAnimationView 访问 Rive 中的 Run Text,并且 修改 Run Text 的内容。

// 获取文本
fun getTextRunValue(textRunName: String): String?
fun getTextRunValue(textRunName: String, path: String): String?
// 设置文本
fun setTextRunValue(textRunName: String, textValue: String)
fun setTextRunValue(textRunName: String, textValue: String, path: String)

​ 说明:要想在 Android 中访问到 Rive 的 Run Text,需要右键文本的 Run Text,并勾选 Export name。

2 应用

​ 本节将演示 Android 与 Rive 交互的应用,Rive 在 Android 中的环境配置详见 → Rive在Android上的简单应用。本节完整资源详见 → Android与Rive交互应用案例。

2.1 Inputs交互应用

​ 本节主要介绍 Android 传递参数给 Rive,使得动画状态机中某些状态的过渡条件满足,触发动画由 A 状态过渡到 B 状态。关于 Android 传递参数给 Rive 触发混合动画的混合比例变化的应用详见 → 【Rive】混合动画。

1)时间线、输入变量

img

​ ①时间线说明:Color_Red、Color_Green、Color_Blue 都只对颜色参数做动画,并且都只有一帧,对应的颜色分别是红、绿、蓝;Rotate_P、Rotate_N 都只对旋转参数做动画,并且都只有一帧,对应的旋转值分别是 0°、-90°;Scale_Idle、Scale 都只对缩放参数做动画,Scale_Idle 只有一帧,值为 0,Scale 里有 3 帧,值分别为 100%、120%、100%。

​ ②输入变量说明:Number_Color 是 Number 类型参数,用于控制颜色动画的过渡条件;Boolean_Rotate 是 Boolean 类型参数,用于控制旋转动画的过渡条件;Trigger_Scale 是 Trigger 类型参数,用于控制缩放动画的过渡条件。

2)状态机

img

​ ①Color状态机说明:当 Number_Color 分别为 0、1、2 时,颜色会切换到红色、绿色、蓝色,过渡时长都设置为 300ms。

​ ②Rotate状态机说明:当 Boolean_Rotate 分别为 true 或 false 时,会正向或逆向旋转 90°。

​ ③Scale状态机说明:当 Trigger_Scale 被激活时,会触发一次缩放动画,Scale→Scale_Idle 过渡条件的 Exit Time 设置为 100%。

3)MainActivity

package com.zhyan8.testInputsimport android.os.Bundle
import android.view.View
import android.widget.CheckBox
import android.widget.RadioButton
import androidx.appcompat.app.AppCompatActivity
import app.rive.runtime.kotlin.RiveAnimationViewclass MainActivity : AppCompatActivity() {private lateinit var riveAnimView: RiveAnimationViewprivate lateinit var checkBox: CheckBoxoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)riveAnimView = findViewById(R.id.rive_view)checkBox = findViewById(R.id.check_box)checkBox.setOnCheckedChangeListener { _, isChecked ->riveAnimView.setBooleanState("State Machine 1", "Boolean_Rotate", isChecked)}}fun onColorSelect(view: View) {if (view is RadioButton && view.isChecked) {when (view.getId()) {R.id.color_red ->riveAnimView.setNumberState("State Machine 1", "Number_Color", 0f)R.id.color_green ->riveAnimView.setNumberState("State Machine 1", "Number_Color", 1f)R.id.color_blue ->riveAnimView.setNumberState("State Machine 1", "Number_Color", 2f)}}}fun onClick(view: View) {riveAnimView.fireState("State Machine 1", "Trigger_Scale")}
}

4)layout_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.zhyan8.testText.MainActivity"android:orientation="vertical"android:gravity="center_vertical"android:paddingLeft="16dp"android:paddingRight="16dp"><app.rive.runtime.kotlin.RiveAnimationViewandroid:id="@+id/rive_view"android:layout_gravity="center_horizontal"android:layout_width="300dp"android:layout_height="300dp"app:riveFit="COVER"app:riveResource="@raw/test_text"app:riveStateMachine="State Machine 1" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/edit_text"android:layout_width="200dp"android:layout_height="wrap_content"android:maxLength="10"android:onClick="onClick"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:text="提交"android:onClick="onClick"/></LinearLayout></LinearLayout>

5)运行效果

img

2.2 文本操作应用

​ 本节主要介绍 Android 传递文本给 Rive,Rive 刷新文本显示。

​ 文本操作的官方介绍详见 → https://rive.app/community/doc/text/docn2E6y1lXo。

1)配置 Export name

​ 需要与 Android 交互的文本在导出前需要配置 Export name,如下,选中 Text Run,在右键菜单中勾选 Export name。

img

2)MainActivity

package com.zhyan8.testTextimport android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import app.rive.runtime.kotlin.RiveAnimationViewclass MainActivity : AppCompatActivity() {private lateinit var riveAnimView: RiveAnimationViewprivate lateinit var editText: EditTextoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)riveAnimView = findViewById(R.id.rive_view)editText = findViewById(R.id.edit_text)}fun onClick(view: View) {val oldText = riveAnimView.getTextRunValue("Run_1")Log.i("MainActivity", "onClick, oldText=$oldText")val newText = editText.text.toString()if (!newText.isNullOrEmpty()) {riveAnimView.setTextRunValue("Run_1", newText)}}
}

3)layout_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.zhyan8.testText.MainActivity"android:orientation="vertical"android:gravity="center_vertical"android:paddingLeft="16dp"android:paddingRight="16dp"><app.rive.runtime.kotlin.RiveAnimationViewandroid:id="@+id/rive_view"android:layout_gravity="center_horizontal"android:layout_width="300dp"android:layout_height="300dp"app:riveFit="COVER"app:riveResource="@raw/test_text"app:riveStateMachine="State Machine 1" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/edit_text"android:layout_width="200dp"android:layout_height="wrap_content"android:maxLength="10"android:onClick="onClick"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:text="提交"android:onClick="onClick"/></LinearLayout></LinearLayout>

4)运行效果

img

​ 声明:本文转自【Rive】Android与Rive交互。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Rive】混合动画

1 混合动画简介 ​ 【Rive】动画 中介绍了 Rive 中动画的基础概念和一般动画的制作流程,本文将介绍混合动画的基础概念和一般制作流程。Unity 中混合动画介绍详见→ 【Unity3D】动画混合。 ​ 混合动画是指同一时刻多个动画按照一定比例同时执行,这些动画控制的动画参数…

Command-line Environment

Command-line Environment 任务控制 shell会使用UNIX提供的信号机制去执行进程间的通信,进程收到信号的时候,会基于信号改变其执行 停止 停止任务:^c 信号:SIGINT在进行find遍历目录时,使用^c,发出SIGINT到该进程,停止了该任务 课程中提供了一个脚本,忽略了SIGINT信号的…

【嵌入式开发】探讨下PC端的BLE开发

目前在嵌入式设备端,实现了不少ble的功能。比如音频传输,图片传输。一般要方便演示,需要开发个对应的手机app。但是我又是很偷懒的人。想着,python这个工具这么强大,在PC端可以用python几行代码就实现掉吧? 说干就干! 根据同事的推荐,用了python的bleak蓝牙库。 我是在…

Jmeter 修改Sampler result 结果信息

首先说一下,jmeter的Sampler result是什么? Jmeter 的Samplers result 是jmeter在向服务器发送请求后,接收到服务器响应的基本信息的展示,如 sample 的开始请求时间、发送的内容大小、基于协议的响应状态码和响应消息等信息。 什么是基于协议的响应状态码和响应消息。比如h…

Shell Script

Shell Script 赋值操作 foo=bar echo $foo注意: 不要使用空格分开shell 将会把foo当作一个程序 转义 Bash通过使用和""来定义字符串 ""会将字符串中的变量转义 echo "String is $foo"会将字符串中的变量原样输出 echo String is $foo函数 函数内…

聊一聊 C#前台线程 如何阻塞程序退出

一:背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题:后台线程的内部是如何运转的 ? ,犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程序无法退出的bug,最后发现是有一个 Backgrond=false 的线程导致的。恰巧在我分析的350+dum…

聊一聊 C#后台线程 如何阻塞程序退出

一:背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题:后台线程的内部是如何运转的 ? ,犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程序无法退出的bug,最后发现是有一个 Backgrond=false 的线程导致的。恰巧在我分析的350+dum…

offset explorer如何安装?附获取方式

前言 大家好,我是小徐啊。我们在Java开发的时候,有时候需要进行大数据的开发,或者需要使用消息队列,这个时候,就需要用到kafka这个组件了。而对于我们平常运维来说,最好有一个可视化的连接kafka的工具。今天小徐就来介绍一款连接Kafka的工具,是offset explorer,介绍下w…

NUMA的取舍与优化设置

NUMA的取舍与优化设置在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%;在bios层面numa关闭时,无论os层面的numa是否打开,都不会影响性能。 安装numactl: #yum install numactl -y #numastat 等同于 cat /sys/devices/system/node/node0/numa…

2024-2025-1(20241321)《计算机基础与程序设计》第十三周学习总结

这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第十三周作业)这个作业的目标 <深刻学习C语言,反思一周学习,温故知新>作业正文 ... 本博客链接https://www.…

解决 PbootCMS 附件上传报错

根据你提供的信息,PbootCMS 附件上传时报错: 上传失败:UNKNOW: Code: 8192; Desc: stripos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior; File: /www/wwwroot/aaa.xxxx.com/core/fu…

如何修改网站的错误,网站错误排查与修复

网站错误可能由多种原因引起,以下是一些常见的排查和修复步骤:查看错误日志:在服务器上查看错误日志文件,通常位于 logs 文件夹中。 分析日志中的错误信息,确定问题原因。浏览器开发者工具:使用浏览器的开发者工具(F12),查看控制台中的错误信息。 检查网络请求,查看是…