Slide 176
Slide 176 text
class CollapsibleConstraintLayout : ConstraintLayout, AppBarLayout.OnOffsetChangedListener {
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
private var mLastPosition : Int = 0
private var mToolbarOpen = true
private var mTransitionThreshold = 0.35f
private val mOpenToolbarSet: ConstraintSet = ConstraintSet()
private val mCloseToolbarSet: ConstraintSet = ConstraintSet()
private var mBackground: ImageView? = null
private var mTitle : TextView? = null
private var mIcon : ImageView? = null
private var mTranslationTitle : AnimationHelper? = null
private var mTranslationIcon : AnimationHelper? = null
private var showImageAnimator : Animator? = null
private var hideImageAnimator : Animator? = null
class AnimationHelper(view : View){
var initialValue = 0
var target = view
init {
initialValue = target.left
}
fun evaluate() {
if (initialValue != target.left) {
var delta = (initialValue - target.left).toFloat()
val anim = ObjectAnimator.ofFloat(target, "translationX", delta, 0f)
anim.duration = 400
anim.start()
initialValue = target.left
}
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
if (false && parent is AppBarLayout) {
var appBarLayout = parent as AppBarLayout
appBarLayout.addOnOffsetChangedListener(this)
mOpenToolbarSet.clone(context, R.layout.open)
mCloseToolbarSet.clone(context, R.layout.close)
mBackground = findViewById(R.id.background)
mTitle = findViewById(R.id.name)
mIcon = findViewById(R.id.icon)
showImageAnimator = ObjectAnimator.ofFloat(mBackground, "alpha", 0f, 1f)
showImageAnimator?.duration = 600
hideImageAnimator = ObjectAnimator.ofFloat(mBackground, "alpha", 1f, 0f)
hideImageAnimator?.duration = 600
}
}
override fun onOffsetChanged(appBarLayout: AppBarLayout?, verticalOffset: Int) {
if (mLastPosition == verticalOffset) {
return
}
mLastPosition = verticalOffset
val progress = Math.abs(verticalOffset / appBarLayout?.getHeight()?.toFloat()!!)
val params = getLayoutParams() as AppBarLayout.LayoutParams
params.topMargin = -verticalOffset
setLayoutParams(params)
if (mToolbarOpen && progress > mTransitionThreshold) {
mCloseToolbarSet.applyTo(this)
hideImageAnimator?.start()
mToolbarOpen = false
} else if (!mToolbarOpen && progress < mTransitionThreshold) {
mOpenToolbarSet.applyTo(this)
showImageAnimator?.start()
mToolbarOpen = true
}
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
if (mTitle != null && mTranslationTitle == null) {
mTranslationTitle = AnimationHelper(mTitle!!)
}
if (mIcon != null && mTranslationIcon == null) {
mTranslationIcon = AnimationHelper(mIcon!!)
}
mTranslationTitle?.evaluate()
mTranslationIcon?.evaluate()
}
}
onLayout
2
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
if (mTitle != null && mTranslationTitle == null) {
mTranslationTitle = AnimationHelper(mTitle!!)
}
if (mIcon != null && mTranslationIcon == null) {
mTranslationIcon = AnimationHelper(mIcon!!)
}
mTranslationTitle?.evaluate()
mTranslationIcon?.evaluate()
}