将现有项目中的现有 kotlin 文件迁移到 Jetpack Compose [英] Migrate existing kotlin files from an existing project into Jetpack Compose
问题描述
我已更新到 Kotlin 1.5.20,并且我看到了 Google 打算让 Jetpack Compose 成为设计 UI 的首选选项.我想问一下我是否可以迁移我在 Kotlin 中预先编写的用于设计部分的代码到 Jetpack Compose(因为我们可以在 Android Studio 中将 Java 文件迁移到 Kotlin).
I've updated to Kotlin 1.5.20, and I am seeing the intention of Google to make Jetpack Compose the preferred option for designing UIs. I wanted to ask if I can migrate my pre-written code in Kotlin for the designing part into Jetpack Compose (as we can migrate Java files to Kotlin in Android Studio).
示例代码:
import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintSet
import androidx.transition.TransitionManager
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
class MainActivity : AppCompatActivity() {
private lateinit var coverImage: View
private lateinit var menuButton: ImageButton
private lateinit var movieStatus: TextView
private lateinit var movieTitle: TextView
private lateinit var movieDescription: TextView
private lateinit var movieRating: TextView
private lateinit var descriptionButton: ImageButton
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_FULLSCREEN)
setContentView(R.layout.activity_main)
addConstraintSetAnimation()
}
private fun addConstraintSetAnimation() {
coverImage = cover
menuButton = menu_button
movieStatus = status
movieTitle = movie_title
movieDescription = desc
movieRating = rating
descriptionButton = description_button
var isCoverView = false
var isDescriptionView = false
val initialConstraint = ConstraintSet()
initialConstraint.clone(root)
val coverConstraint = ConstraintSet()
coverConstraint.clone(this, R.layout.cover_view)
val descriptionConstraint = ConstraintSet()
descriptionConstraint.clone(this, R.layout.description_view)
val mapOfDays: Map<TextView, TextView> = mapOf(
day_1 to date_1,
day_2 to date_2,
day_3 to date_3,
day_4 to date_4,
day_5 to date_5,
day_6 to date_6,
day_7 to date_7
)
val days: List<TextView> = listOf(day_1, day_2, day_3, day_4, day_5, day_6, day_7)
for (day in days) {
day.setOnClickListener { selectDate(it as TextView, descriptionConstraint) }
}
for (day in mapOfDays) {
day.value.setOnClickListener { selectDate(day.key, descriptionConstraint) }
}
coverImage.setOnClickListener {
if (!isCoverView) {
TransitionManager.beginDelayedTransition(root)
coverConstraint.applyTo(root)
val anim = ValueAnimator()
anim.setIntValues(Color.BLACK, Color.WHITE)
anim.setEvaluator(ArgbEvaluator())
anim.addUpdateListener {
menuButton.setColorFilter(it.animatedValue as Int)
movieStatus.setTextColor(it.animatedValue as Int)
movieTitle.setTextColor(it.animatedValue as Int)
movieDescription.setTextColor(it.animatedValue as Int)
movieRating.setTextColor(it.animatedValue as Int)
descriptionButton.setColorFilter(it.animatedValue as Int)
}
anim.duration = 300
anim.start()
isCoverView = true
isDescriptionView = false
}
}
menuButton.setOnClickListener {
if (isCoverView) {
TransitionManager.beginDelayedTransition(root)
initialConstraint.applyTo(root)
val anim = ValueAnimator()
anim.setIntValues(Color.WHITE, Color.BLACK)
anim.setEvaluator(ArgbEvaluator())
anim.addUpdateListener {
menuButton.setColorFilter(it.animatedValue as Int)
movieStatus.setTextColor(it.animatedValue as Int)
movieTitle.setTextColor(it.animatedValue as Int)
movieDescription.setTextColor(it.animatedValue as Int)
movieRating.setTextColor(it.animatedValue as Int)
descriptionButton.setColorFilter(it.animatedValue as Int)
}
anim.duration = 300
anim.start()
isCoverView = false
isDescriptionView = false
} else if (isDescriptionView) {
TransitionManager.beginDelayedTransition(root)
initialConstraint.applyTo(root)
isCoverView = false
isDescriptionView = false
}
}
descriptionButton.setOnClickListener {
if (!isDescriptionView) {
TransitionManager.beginDelayedTransition(root)
descriptionConstraint.applyTo(root)
if (isCoverView) {
val anim = ValueAnimator()
anim.setIntValues(Color.WHITE, Color.BLACK)
anim.setEvaluator(ArgbEvaluator())
anim.addUpdateListener {
menuButton.setColorFilter(it.animatedValue as Int)
movieStatus.setTextColor(it.animatedValue as Int)
movieTitle.setTextColor(it.animatedValue as Int)
movieDescription.setTextColor(it.animatedValue as Int)
movieRating.setTextColor(it.animatedValue as Int)
descriptionButton.setColorFilter(it.animatedValue as Int)
}
anim.duration = 300
anim.start()
isCoverView = false
}
isDescriptionView = true
}
}
}
private fun selectDate(day: TextView, destinationConstraint: ConstraintSet) {
destinationConstraint.connect(
date_selector.id,
ConstraintSet.START,
day.id,
ConstraintSet.START
)
destinationConstraint.connect(
date_selector.id,
ConstraintSet.END,
day.id,
ConstraintSet.END
)
TransitionManager.beginDelayedTransition(root)
destinationConstraint.applyTo(root)
}
推荐答案
简短回答:不,不是您可以自动将 Java 转换为 Kotlin 的方式.
Short answer: No, not the way you can automatically convert Java to Kotlin.
Jetpack Compose 使用完全不同的编程范式,其中包含与 Android View 工具包不同的行为和功能的全新小部件.直接的、机械的转换是难以处理的.
Jetpack Compose uses a fundamentally different programming paradigm with entirely new widgets with different behaviors and features than the Android View toolkit. A straightforward, mechanical conversion would be intractable.
举个例子,组件没有与它们在视图中相同的状态.您不会从文本字段中检索文本,而是在文本字段更改时更新您的状态.
As one example, components don't have state in the same sense as they do in Views. You don't retrieve the text from a text field, you update your state when the text field changes.
这篇关于将现有项目中的现有 kotlin 文件迁移到 Jetpack Compose的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!