【问题标题】:I wanted to make a frame by frame animation, in android studios for an app我想在 android studios 中为应用程序制作逐帧动画
【发布时间】:2022-01-11 18:37:20
【问题描述】:

我想在 Kotlin 中复制的视频代码,大部分时间我都能遵循。 https://www.youtube.com/watch?v=scZYIAZrMWk&t=192s

我认为我唯一遇到的问题是如何使用 AnimationDrawable 函数,它在 Kotlin 中,我可以调用它;但是,它在视频中的使用方式与在 Kotlin 中的使用方式不同,因为视频是在 java 中。

我尝试查找它在 kotlin 中的使用方式,但没有 bean,即使我正在搜索 kotlin,我也一直在了解它在 java 中的使用方式。

我正在尝试完全复制这一行:AnimationDrawable diceAnimation; 仅适用于 java。

我是编程新手,所以我认为 Var diceAnimation = AnimationDrawable() 可能会起作用。它没有工作,但不是错误,但它也不正确。我知道这不对,写吧。

这是没有它的代码:

package com.wedontprogram.devilsdice

import android.graphics.drawable.AnimationDrawable
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        
        var dealerDiceView1 = findViewById<ImageView>(R.id.dealerDice1)
        dealerDiceView1.setBackgroundResource(R.drawable.dice_animation)
        diceAnimation = dealerDiceView1.background()
    }
}

【问题讨论】:

  • AnimationDrawable diceAnimation; 只是定义一个变量及其类型,而不是创建一个对象。 Kotlin 等价物是 val/var diceAnimation: AnimationDrawable - IDE 通常会将您粘贴的 Java 转换为 Kotlin,但是熟悉一些 Java 基础知识是个好主意,因为您经常会遇到这些问题

标签: java android android-studio kotlin android-animation


【解决方案1】:

Java 代码定义了一个名为 diceAnimation(视频中是 wifiAnimation)的成员变量,其类型为 AnimationDrawable,初始值为 null(即隐式),然后在 onCreate() 内部是将dealerDiceView1.background() 分配给该变量。由于视图背景的类型仅报告为Drawable,因此他们必须将返回值转换为更具体的AnimationDrawable 类型才能将其分配给该变量。 Java 通过在项目前面加上括号中的类型来转换项目。

Kotlin 没有成员变量。相反,它具有属性。由于这个diceAnimation 永远不需要为空,并且我们在onCreate() 中设置它的值,因此将其设置为lateinit var 属性是合适的,因此我们不必给它一个初始值。所以我们可以给它一个类型AnimationDrawable而不是AnimationDrawable?。您希望尽可能避免使用可为空的类型,因为它们更难使用且更容易出错。

由于我在第一段中提到的原因,您还必须在分配时转换返回值。转换是使用 Kotlin 中的 as 关键字完成的。

如果您不熟悉什么是强制转换,它基本上是在告诉编译器您承诺某个对象的类型比编译器知道的更具体,因此编译器可以开始将其视为更具体的类型。在这种情况下,由于 View 的背景可以是任意类型的 Drawable,所以在获取背景时,编译器只知道它是 Drawable。通过将其转换为 AnimationDrawable,您向编译器保证您知道背景实际上是一个特定的 AnimationDrawable,然后编译器将允许您将其分配给更具体类型的变量或属性。

class MainActivity : AppCompatActivity() {
    private lateinit var diceAnimation: AnimationDrawable

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        
        var dealerDiceView1 = findViewById<ImageView>(R.id.dealerDice1)
        dealerDiceView1.setBackgroundResource(R.drawable.dice_animation)
        diceAnimation = dealerDiceView1.background() as AnimationDrawable
    }
}

【讨论】:

    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2016-10-14
    相关资源
    最近更新 更多