【Rive】Android与Rive交互

1 Android与Rive交互的常用接口

1.1 RiveAnimationView参数

<app.rive.runtime.kotlin.RiveAnimationView 	android: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)时间线、输入变量

【Rive】Android与Rive交互

​ ①时间线说明: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)状态机

【Rive】Android与Rive交互

​ ①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.testInputs  import 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.RiveAnimationView  class MainActivity : AppCompatActivity() {     private lateinit var riveAnimView: RiveAnimationView     private lateinit var checkBox: CheckBox      override 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"?> <LinearLayout     xmlns: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.RiveAnimationView         android: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" />      <LinearLayout         android:layout_width="match_parent"         android:layout_height="wrap_content">         <EditText             android:id="@+id/edit_text"             android:layout_width="200dp"             android:layout_height="wrap_content"             android:maxLength="10"             android:onClick="onClick"/>         <Button             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_marginLeft="20dp"             android:text="提交"             android:onClick="onClick"/>     </LinearLayout>  </LinearLayout> 

5)运行效果

【Rive】Android与Rive交互

2.2 文本操作应用

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

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

1)配置 Export name

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

【Rive】Android与Rive交互

2)MainActivity

package com.zhyan8.testText  import 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.RiveAnimationView  class MainActivity : AppCompatActivity() {     private lateinit var riveAnimView: RiveAnimationView     private lateinit var editText: EditText      override 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"?> <LinearLayout     xmlns: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.RiveAnimationView         android: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" />      <LinearLayout         android:layout_width="match_parent"         android:layout_height="wrap_content">         <EditText             android:id="@+id/edit_text"             android:layout_width="200dp"             android:layout_height="wrap_content"             android:maxLength="10"             android:onClick="onClick"/>         <Button             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_marginLeft="20dp"             android:text="提交"             android:onClick="onClick"/>     </LinearLayout>  </LinearLayout> 

4)运行效果

【Rive】Android与Rive交互

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

发表评论

相关文章