1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
package com.pitchedapps.frost.views
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.support.annotation.StringRes
import android.view.View
import android.view.ViewAnimationUtils
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import android.view.animation.DecelerateInterpolator
import android.widget.TextView
/**
* Created by Allan Wang on 2017-06-01.
*/
fun View.rootCircularReveal(x: Int = 0, y: Int = 0, duration: Long = 500L, onStart: (() -> Unit)? = null, onFinish: (() -> Unit)? = null) {
this.addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
override fun onLayoutChange(v: View, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int,
oldRight: Int, oldBottom: Int) {
v.removeOnLayoutChangeListener(this)
var x2 = x
var y2 = y
if (x2 > right) x2 = 0
if (y2 > bottom) y2 = 0
val radius = Math.hypot(Math.max(x2, right - x2).toDouble(), Math.max(y2, bottom - y2).toDouble()).toInt()
val reveal = ViewAnimationUtils.createCircularReveal(v, x2, y2, 0f, radius.toFloat())
reveal.interpolator = DecelerateInterpolator(1f)
reveal.duration = duration
reveal.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?) {
visibility = View.VISIBLE
onStart?.invoke()
}
override fun onAnimationEnd(animation: Animator?) = onFinish?.invoke() ?: Unit
override fun onAnimationCancel(animation: Animator?) = onFinish?.invoke() ?: Unit
})
reveal.start()
}
})
}
fun View.circularReveal(x: Int = 0, y: Int = 0, offset: Long = 0L, radius: Float = -1.0f, duration: Long = 500L, onStart: (() -> Unit)? = null, onFinish: (() -> Unit)? = null) {
if (!isAttachedToWindow) {
visibility = View.VISIBLE
return
}
var r = radius
if (r < 0.0f) {
r = Math.max(Math.hypot(x.toDouble(), y.toDouble()), Math.hypot((width - x.toDouble()), (height - y.toDouble()))).toFloat()
}
val anim = ViewAnimationUtils.createCircularReveal(this, x, y, 0f, r).setDuration(duration)
anim.startDelay = offset
anim.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?) {
visibility = View.VISIBLE
onStart?.invoke()
}
override fun onAnimationEnd(animation: Animator?) = onFinish?.invoke() ?: Unit
override fun onAnimationCancel(animation: Animator?) = onFinish?.invoke() ?: Unit
})
anim.start()
}
fun View.fadeIn(offset: Long = 0L, duration: Long = 200L, onStart: (() -> Unit)? = null, onFinish: (() -> Unit)? = null) {
if (!isAttachedToWindow) {
visibility = View.VISIBLE
return
}
if (isAttachedToWindow) {
val anim = AnimationUtils.loadAnimation(context, android.R.anim.fade_in)
anim.startOffset = offset
anim.duration = duration
anim.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(animation: Animation?) {}
override fun onAnimationEnd(animation: Animation?) = onFinish?.invoke() ?: Unit
override fun onAnimationStart(animation: Animation?) {
visibility = View.VISIBLE
onStart?.invoke()
}
})
startAnimation(anim)
}
}
fun View.fadeOut(offset: Long = 0L, duration: Long = 200L, onStart: (() -> Unit)? = null, onFinish: (() -> Unit)? = null) {
if (!isAttachedToWindow) {
visibility = View.INVISIBLE
return
}
val anim = AnimationUtils.loadAnimation(context, android.R.anim.fade_out)
anim.startOffset = offset
anim.duration = duration
anim.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(animation: Animation?) {}
override fun onAnimationEnd(animation: Animation?) {
visibility = View.INVISIBLE
onFinish?.invoke()
}
override fun onAnimationStart(animation: Animation?) {
onStart?.invoke()
}
})
startAnimation(anim)
}
fun TextView.setTextWithFade(text: String, duration: Long = 200, onFinish: (() -> Unit)? = null) {
fadeOut(duration = duration, onFinish = {
setText(text)
fadeIn(duration = duration, onFinish = onFinish)
})
}
fun TextView.setTextWithFade(@StringRes textId: Int, duration: Long = 200, onFinish: (() -> Unit)? = null) = setTextWithFade(context.getString(textId), duration, onFinish)
|