如何解决Android从右到左的textview滑动动画
我目前正在构建一个服装店应用程序,我想要实现的一个功能是主页片段顶部的一种信息横幅。我对使用动画比较陌生,但我很确定这是最好的选择。
val information = listof("information 1","information 2","information 3")
我想要做的是让每个字符串从右侧滑入片段中(需要 2 秒),在中心停留 3 秒,然后在 2 秒内滑出屏幕到左侧,而下一个信息正在滑入。重要的一点是我希望这永远重复(只要你留在 Home 片段上)。
它看起来像这样:
1) Left side of screen -> | information 1 | <- Right side of screen
2) Left side of screen -> | information 1 information 2 | <- Right side of screen
3) Left side of screen -> | information 2 | <- Right side of screen
向右居中
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:startOffset="3000">
<translate
android:fromXDelta="100%p"
android:toXDelta="0%p"
android:duration="2000"/>
</set>
中心向左
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:startOffset="3000">
<translate
android:fromXDelta="0%p"
android:toXDelta="-100%p"
android:duration="2000"/>
</set>
不幸的是,我不知道如何让它真正起作用,非常感谢一些帮助。
编辑
我使用了视图绑定和将信息存储为 LiveData<List<String>>
的视图模型,并且动画的设置在 onCreateView
函数中完成。
我的做法是这样的:
override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
binding = FragmentHomeBinding.inflate(inflater,container,false)
homeviewmodel.setBannerinformation(listof(
"information 1","information 3"
))
homeviewmodel.bannerinformation.observe(viewLifecycleOwner,{ informationList ->
val rightToCenter = AnimationUtils.loadAnimation(binding.bannerinformation.context,R.anim.banner_information_animation_right_to_center)
val centerToLeft = AnimationUtils.loadAnimation(binding.bannerinformation.context,R.anim.banner_information_animation_center_to_left)
binding.bannerinformation.text = informationList.first()
binding.bannerinformation.startAnimation(rightToCenter)
binding.bannerinformation.startAnimation(centerToLeft)
})
return binding.root
}
解决方法
我已经找到了解决我的问题的方法,这似乎是一个笨拙的解决方案,但到目前为止它是有效的。
首先,创建一个动画资源文件来做你想要的动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<translate
android:fromXDelta="100%p"
android:toXDelta="0%p"
android:duration="2000"/>
<translate
android:startOffset="3500"
android:fromXDelta="0%p"
android:toXDelta="-100%p"
android:duration="2000"/>
</set>
接下来,创建一个函数来定义动画和要发生的变化
private fun animateInformationBanner(information: List<String>,start: Int = 0) : Animation {
var index = start
val animation = AnimationUtils.loadAnimation(binding.bannerInformation.context,R.anim.banner_information_animation)
animation.setAnimationListener(object: Animation.AnimationListener {
override fun onAnimationStart(animation: Animation?) {
binding.bannerInformation.text = information[index % information.size]
}
override fun onAnimationEnd(animation: Animation?) {
index++
binding.bannerInformation.text = null
binding.bannerInformation.startAnimation(animation)
}
override fun onAnimationRepeat(animation: Animation?) {
TODO("Not yet implemented")
}
})
return animation
}
最后,将动画应用到 TextView
homeViewModel.bannerInformation.observe(viewLifecycleOwner,{ informationList ->
binding.bannerInformation.startAnimation(animateInformationBanner(informationList))
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。