跳到主要内容

Rive 事件

⚠️ 已弃用:推荐使用数据绑定(Data Binding)替代事件(Events)。

Rive 事件允许你的应用响应状态机中触发的事件。

添加事件监听器

RiveAnimationView 上使用 addEventListenerremoveEventListener 来订阅/取消订阅 RiveFileController.RiveEventListener

该监听器接收 OpenURLRiveEventGeneralRiveEvent 类型的 RiveEvent

private val yourRiveAnimationView: RiveAnimationView by lazy(LazyThreadSafetyMode.NONE) {
findViewById(R.id.your_animation_view)
}

val eventListener = object : RiveFileController.RiveEventListener {
override fun notifyEvent(event: RiveEvent) {
when (event) {
is OpenURLRiveEvent -> {
Log.i("RiveEvent", "Open URL Rive event: ${event.url}")
}
is GeneralRiveEvent -> {
Log.i("RiveEvent", "General Rive event")
}
}
Log.i("RiveEvent", "name: ${event.name}")
Log.i("RiveEvent", "type: ${event.type}")
Log.i("RiveEvent", "properties: ${event.properties}")
Log.i("RiveEvent", "data: ${event.data}")
}
}

yourRiveAnimationView.addEventListener(eventListener)

// 不再需要时移除
override fun onDestroy() {
yourRiveAnimationView.removeEventListener(eventListener)
super.onDestroy()
}

Rive Android 运行在独立线程上。从 Rive 事件触发的任何 UI 更新需要通过 runOnUiThread 手动标记到 UI 线程上运行。

打开 URL

OpenUrlRiveEvent 类型的事件不会自动打开链接,需要在项目中手动添加代码。

val eventListener = object : RiveFileController.RiveEventListener {
override fun notifyEvent(event: RiveEvent) {
when (event) {
is OpenURLRiveEvent -> {
runOnUiThread {
try {
val uri = Uri.parse(event.url)
val browserIntent = Intent(Intent.ACTION_VIEW, uri)
startActivity(browserIntent)
} catch (e: Exception) {
Log.i("RiveEvent", "Not a valid URL ${event.url}")
}
}
}
}
}
}

也可以通过 event.target 访问 URL 的目标位置(在编辑器中设置)。

示例:响应自定义属性

以下示例展示了如何响应名为 "StarRating" 的 Rive 事件,该事件包含一个名为 "Rating" 的自定义数字属性:

val eventListener = object : RiveFileController.RiveEventListener {
override fun notifyEvent(event: RiveEvent) {
when (event) {
is GeneralRiveEvent -> {
runOnUiThread {
if (event.name == "StarRating" && event.properties.containsKey("rating")) {
starRatingTextView.text = "Star rating: ${event.properties["rating"]}"
}
}
}
}
}
}

通过 event.properties 可以获取包含事件上定义的所有自定义属性的 HashMap