【问题标题】:How to interpret and translate a Lottie animation from Kotlin to Java?如何将 Lottie 动画从 Kotlin 解释和翻译成 Java?
【发布时间】:2021-12-15 22:23:35
【问题描述】:

我一直在尝试将这个 Kotlin 代码翻译成 Java,因为这个项目是 Java 的。我正在通过查看 Kotlin 语法进行翻译。但是,还有一些我很难理解。

https://github.com/airbnb/lottie-android/blob/master/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/AppIntroActivity.kt

具体来说:

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);

【问题讨论】:

标签: java kotlin lottie


【解决方案1】:

setViewPagerScroller 方法使用 kotlin anonymous inner class 语法。那是在 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;
}  

您还可以使用类来更准确地表示字段的延迟初始化。 (这样您就不会错误地访问您打算延迟初始化的字段)这会变得更加冗长,但可能值得。

【讨论】:

  • 感谢您的帮助,这就是为什么我无法在 java 中搜索“object:”的等价物。 LottieAnimationView 怎么样?我似乎无法翻译它... private LottieAnimationView animationView; public LottieAnimationView getAnimationView() { (ViewGroup)IntroWalkthroughActivity.this.getRootView().inflate(R.layout.activity_intro_app_walkthrough, false); }
  • 确保在需要时将正确的对象转换为正确的类,最后转换为LottieAnimationView,然后将其存储在您的字段中
  • 请注意,Kotlin 中的 lazy 还确保线程安全,而 Java 中的普通 if 则无法做到这一点。我想在你的情况下这应该没问题,因为这些视图可能只能从主线程访问,但在从这个翻译中得出一般规则之前请记住这一点
猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多