11package com.rayfantasy.icode.ui.activity
22
3+ import android.animation.Animator
4+ import android.animation.AnimatorListenerAdapter
5+ import android.app.Activity
36import android.databinding.DataBindingUtil
7+ import android.graphics.Color
48import android.os.Bundle
9+ import android.view.View
10+ import android.view.animation.DecelerateInterpolator
11+ import com.balysv.materialmenu.MaterialMenuDrawable
512import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator
613import com.rayfantasy.icode.R
714import com.rayfantasy.icode.databinding.ActivityBlocksBinding
@@ -18,8 +25,19 @@ import org.jetbrains.anko.startActivity
1825import org.jetbrains.anko.toast
1926
2027class BlocksActivity : ActivityBindingStatus () {
28+ companion object {
29+ private const val TRANSFORM_DURATION = 300
30+ }
31+
2132 private lateinit var codeGood: CodeGood
2233 private lateinit var binding: ActivityBlocksBinding
34+ private val menuDrawable by lazy {
35+ MaterialMenuDrawable (this , Color .WHITE , MaterialMenuDrawable .Stroke .THIN ,
36+ (TRANSFORM_DURATION * 1.5 ).toInt())
37+ }
38+ private var transformFinished = false
39+ private var scaleY = 0f
40+ private var translationY = 0f
2341
2442 override fun onCreate (savedInstanceState : Bundle ? ) {
2543 super .onCreate(savedInstanceState)
@@ -34,25 +52,90 @@ class BlocksActivity : ActivityBindingStatus() {
3452 }
3553
3654 codeGood.loadContentFromCache()
37- codeGood.content?.let { recyclerView.adapter = BlockAdapter (this , codeGood, PostUtil .gson.fromJson(codeGood.content)) }
3855
3956 PostUtil .loadCodeContent(codeGood.id!! ,
4057 {
4158 with (codeGood) {
4259 content = it
4360 save()
4461 }
45- if (recyclerView.adapter == null )
46- recyclerView.adapter = BlockAdapter (this , codeGood, PostUtil .gson.fromJson(codeGood.content))
47- else {
48- (recyclerView.adapter as BlockAdapter ).blocks = PostUtil .gson.fromJson(codeGood.content)
49- recyclerView.adapter.notifyDataSetChanged()
62+ if (transformFinished) {
63+ if (recyclerView.adapter == null )
64+ recyclerView.adapter = BlockAdapter (this , codeGood, PostUtil .gson.fromJson(codeGood.content))
65+ else {
66+ (recyclerView.adapter as BlockAdapter ).blocks = PostUtil .gson.fromJson(codeGood.content)
67+ recyclerView.adapter.notifyDataSetChanged()
68+ }
5069 }
5170 }, { t, rc ->
5271 toast(" rc = $rc " )
5372 t.printStackTrace()
5473 })
5574 block_fab.onClick { startActivity<ReplyActivity >(" id" to codeGood.id) }
75+
76+ toolbar.navigationIcon = menuDrawable
77+ if (intent.hasExtra(" y" ) && intent.hasExtra(" height" )) {
78+ if (intent.getBooleanExtra(" arrowAnim" , true )) {
79+ menuDrawable.iconState = MaterialMenuDrawable .IconState .BURGER
80+ menuDrawable.animateIconState(MaterialMenuDrawable .IconState .ARROW )
81+ } else {
82+ menuDrawable.iconState = MaterialMenuDrawable .IconState .ARROW
83+ }
84+ recyclerView.alpha = 0f
85+ recyclerView.post {
86+ scaleY = (intent.getFloatExtra(" height" , 0f ) / recyclerView.height).toFloat()
87+ translationY = intent.getFloatExtra(" y" , 0f ) - (recyclerView.height / 2 )
88+ recyclerView.scaleY = scaleY
89+ recyclerView.translationY = translationY
90+ recyclerView.alpha = 1f
91+ recyclerView.animate()
92+ .setInterpolator(DecelerateInterpolator ())
93+ .translationY(0f )
94+ .scaleY(1f )
95+ .setDuration(TRANSFORM_DURATION .toLong())
96+ .start()
97+ }
98+ } else {
99+ menuDrawable.iconState = MaterialMenuDrawable .IconState .ARROW
100+ }
101+
102+ recyclerView.postDelayed({
103+ codeGood.content?.let { recyclerView.adapter = BlockAdapter (this , codeGood, PostUtil .gson.fromJson(codeGood.content)) }
104+ }, TRANSFORM_DURATION .toLong())
56105 }
57106
107+ override fun onBackPressed () {
108+ if (intent.hasExtra(" y" ) && intent.hasExtra(" height" )) {
109+ if (intent.getBooleanExtra(" arrowAnim" , true )) {
110+ menuDrawable.animateIconState(MaterialMenuDrawable .IconState .BURGER )
111+ }
112+ recyclerView.adapter = null
113+ recyclerView.animate()
114+ .setInterpolator(DecelerateInterpolator ())
115+ .translationY(translationY)
116+ .scaleY(scaleY)
117+ .setDuration(TRANSFORM_DURATION .toLong())
118+ .setListener(object : AnimatorListenerAdapter () {
119+ override fun onAnimationEnd (animation : Animator ? ) {
120+ super @BlocksActivity.onBackPressed()
121+ overridePendingTransition(0 , 0 )
122+ }
123+ })
124+ .start()
125+ } else {
126+ super .onBackPressed()
127+ }
128+ }
129+ }
130+
131+ fun View.startBlockActivity (codeGood : CodeGood , arrowAnim : Boolean = true) {
132+ val location = intArrayOf(0 , 0 )
133+ getLocationOnScreen(location)
134+ val y = location[1 ]
135+ context.startActivity<BlocksActivity >(" codeGood" to codeGood,
136+ " y" to y.toFloat(),
137+ " height" to height.toFloat(),
138+ " arrowAnim" to arrowAnim)
139+ if (context is Activity )
140+ (context as Activity ).overridePendingTransition(0 , 0 )
58141}
0 commit comments