如何将 Lottie 动画从 Kotlin 解释和转换为 Java?
How to interpret and translate a Lottie animation from Kotlin to Java?
我一直在尝试将此 Kotlin 代码翻译成 Java,因为项目在 Java。我正在通过查看 Kotlin 语法进行翻译。但是,还有一些我很难理解。
具体来说:
private val animationView: LottieAnimationView by lazy {
rootView.inflate(R.layout.app_intro_animation_view, false) as LottieAnimationView
}
private val viewPager: LockableViewPager by lazy {
findViewById<LockableViewPager>(R.id.intro_activity_viewPager)
}
override fun generateFinalButtonBehaviour(): IntroButton.Behaviour {
return object : IntroButton.Behaviour {
override fun setActivity(activity: IntroActivity) { finish() }
override fun getActivity(): IntroActivity? = null
override fun run() {}
}
}
private fun setViewPagerScroller() {
try {
val scrollerField = ViewPager::class.java.getDeclaredField("mScroller")
scrollerField.isAccessible = true
val interpolator = ViewPager::class.java.getDeclaredField("sInterpolator")
interpolator.isAccessible = true
val scroller = object : Scroller(this, interpolator.get(null) as Interpolator) {
override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
super.startScroll(startX, startY, dx, dy, duration * 7)
}
}
scrollerField.set(viewPager, scroller)
} catch (e: NoSuchFieldException) {
// Do nothing.
} catch (e: IllegalAccessException) {
// Do nothing.
}
}
对于 setViewPagerScroller
,我能够翻译第一部分。
Field scrollerField = ViewPager.class.getDeclaredField("mScroller");
scrollerField.setAccessible(true);
Field interpolator = ViewPager.class.getDeclaredField("sInterpolator");
interpolator.setAccessible(true);
方法 setViewPagerScroller 使用 kotlin anonymous inner class 语法。那是 'object' 部分,在 java 语法中没有真正的对应部分。
private void setViewPagerScroller() {
try {
Field scrollerField = ViewPager.class.getDeclaredField("mScroller");
scrollerField.setAccessible(true);
Field interpolator = ViewPager.class.getDeclaredField("sInterpolator");
interpolator.setAccessible(true);
Scroller scroller = new Scroller(this, (android.view.animation.Interpolator) interpolator.get(null)){
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, duration * 7);
}
}
scrollerField.set(viewPager, scroller);
} catch (NoSuchFieldException error) {
// Do nothing.
} catch (IllegalAccessException error) {
// Do nothing.
}
}
而 as
关键字就像是 java 中的强制转换。希望你能用它来翻译 fun generateFinalButtonBehaviour()
,它包含更多相同的内容。
Lazy 结构在 java 中变得更加冗长也就不足为奇了。如果您选择遵循以下结构,则必须遵守纪律,以免错误地访问 viewpager。
private LockableViewPager viewPager;
private LockableViewPager getViewPager(){
if(viewPager == null){
// produce viewpager and store in field
}
return viewPager;
}
您还可以使用 class 来更准确地表示字段的惰性初始化。 (这样你就不会错误地访问一个你打算延迟初始化的字段)这变得更加冗长但可能是值得的。
我一直在尝试将此 Kotlin 代码翻译成 Java,因为项目在 Java。我正在通过查看 Kotlin 语法进行翻译。但是,还有一些我很难理解。
具体来说:
private val animationView: LottieAnimationView by lazy {
rootView.inflate(R.layout.app_intro_animation_view, false) as LottieAnimationView
}
private val viewPager: LockableViewPager by lazy {
findViewById<LockableViewPager>(R.id.intro_activity_viewPager)
}
override fun generateFinalButtonBehaviour(): IntroButton.Behaviour {
return object : IntroButton.Behaviour {
override fun setActivity(activity: IntroActivity) { finish() }
override fun getActivity(): IntroActivity? = null
override fun run() {}
}
}
private fun setViewPagerScroller() {
try {
val scrollerField = ViewPager::class.java.getDeclaredField("mScroller")
scrollerField.isAccessible = true
val interpolator = ViewPager::class.java.getDeclaredField("sInterpolator")
interpolator.isAccessible = true
val scroller = object : Scroller(this, interpolator.get(null) as Interpolator) {
override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
super.startScroll(startX, startY, dx, dy, duration * 7)
}
}
scrollerField.set(viewPager, scroller)
} catch (e: NoSuchFieldException) {
// Do nothing.
} catch (e: IllegalAccessException) {
// Do nothing.
}
}
对于 setViewPagerScroller
,我能够翻译第一部分。
Field scrollerField = ViewPager.class.getDeclaredField("mScroller");
scrollerField.setAccessible(true);
Field interpolator = ViewPager.class.getDeclaredField("sInterpolator");
interpolator.setAccessible(true);
方法 setViewPagerScroller 使用 kotlin anonymous inner class 语法。那是 'object' 部分,在 java 语法中没有真正的对应部分。
private void setViewPagerScroller() {
try {
Field scrollerField = ViewPager.class.getDeclaredField("mScroller");
scrollerField.setAccessible(true);
Field interpolator = ViewPager.class.getDeclaredField("sInterpolator");
interpolator.setAccessible(true);
Scroller scroller = new Scroller(this, (android.view.animation.Interpolator) interpolator.get(null)){
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, duration * 7);
}
}
scrollerField.set(viewPager, scroller);
} catch (NoSuchFieldException error) {
// Do nothing.
} catch (IllegalAccessException error) {
// Do nothing.
}
}
而 as
关键字就像是 java 中的强制转换。希望你能用它来翻译 fun generateFinalButtonBehaviour()
,它包含更多相同的内容。
Lazy 结构在 java 中变得更加冗长也就不足为奇了。如果您选择遵循以下结构,则必须遵守纪律,以免错误地访问 viewpager。
private LockableViewPager viewPager;
private LockableViewPager getViewPager(){
if(viewPager == null){
// produce viewpager and store in field
}
return viewPager;
}
您还可以使用 class 来更准确地表示字段的惰性初始化。 (这样你就不会错误地访问一个你打算延迟初始化的字段)这变得更加冗长但可能是值得的。