textview|textview - 翻转动画
一直以来我都想好把 textview 好好整整,这不现在得着机会了,还不走起,等着干啥......
先看效果:
文章图片
ezgif.com-video-to-gif.gif 项目地址:BW_Libs
实现思路
所谓翻转,就是 A 面 B 面的切换,和磁带正反面很像的。看图很容易就让我们想起用 rotationY 这个属性来做动画,在动画执行一半之后,切换 view 的显示。 所以我试了试,我用属性动画做的:
- 先用的 0-180 的动画,发现有些问题。在翻转 90 之后,view 的内容也跟着翻转了,文字都是反的着明显不行
- 然后我拆成 2个动画,0-90,90-180,都不行,view 内容还是反着的,我想想,属性都改了,显示肯定也跟着走啊,只要过 90度 都行不啊
动画代码
我把动画部分抽象了一下,做成了一个辅助工具类,因为不光 textview 可以用,只要是 view 都可以用,着应该属于 layout 动画的范畴了吧
ps:我用 button 试了下,发现有蛋疼的阴影扩散问题,可难看了,所以这里用 textview 代替 button
动画辅助类:
class LayoutRotationAnimator(view: View, time: Long = 300) {/**
* 画面切换时显示监听器
*/
interface IStateChangeListener {fun showA()fun showB()
}// A面 = 正面
var STATE_A: Int = 1
// B面 = 反面
var STATE_B: Int = -1
// 当前在哪面
var currentState: Int = STATE_A// A 面动画
var animatorA: ObjectAnimator
// B 面动画
var animatorB: ObjectAnimator// 面切换时显示变化
lateinit var stateChangeListener: IStateChangeListenerinit {animatorA = ObjectAnimator.ofFloat(view, "rotationY", 0f, 90f).setDuration(time)
animatorB = ObjectAnimator.ofFloat(view, "rotationY", -90f, 0f).setDuration(time)animatorA.addListener(object : Animator.AnimatorListener {override fun onAnimationRepeat(animation: Animator?) {
}override fun onAnimationEnd(animation: Animator?) {
view.rotationY = 0f
changeState()
animatorB.start()
}override fun onAnimationCancel(animation: Animator?) {
}override fun onAnimationStart(animation: Animator?) {
}
})
}fun start() {
animatorA.start()
}/**
* 画面更新时切换显示
*/
private fun changeState() {
if (currentState == STATE_A) {
currentState = STATE_B
stateChangeListener?.showB()
} else {
currentState = STATE_A
stateChangeListener?.showA()
}
}}
【textview|textview - 翻转动画】布局使用:
class TextViewActivity : AppCompatActivity() {lateinit var layoutAnimator: LayoutRotationAnimatoroverride fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_text_view)layoutAnimator = LayoutRotationAnimator(btn01)
layoutAnimator.stateChangeListener = object : LayoutRotationAnimator.IStateChangeListener {
override fun showA() {
btn01.setText("正面")
btn01.setBackgroundColor(Color.BLUE)
}override fun showB() {
btn01.setText("反面")
btn01.setBackgroundColor(Color.RED)
}
}btn01.setOnClickListener({
layoutAnimator.start()
})
}}
参考资料:
- Android自定义控件之翻转按钮
推荐阅读
- 2018-04-16动画练习作业
- 好看的动画都有一只有趣的动物,CoCo也不例外
- vue|vue canvas 手绘进度条动画
- 华为可翻转全面屏手机专利亮相(折叠方式好比翻书一样)
- 锦囊26(手势动画打造微信页眉的GIF动图)
- 【数组题】给定一个二进制矩阵|【数组题】给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。
- 迪士尼动画新作《寻龙传说》——一群特别女孩的爱与守护
- SwiftUI|SwiftUI 动画组件之Lottie小型高质量交互式的开源动画文件格式
- 翻转课堂《DISC与团队建设》
- 商业短片动画可以定制吗