Skip to content

Commit 487dcc0

Browse files
committed
BlocksActivity: 使用定制跳转动画
1 parent d2266bb commit 487dcc0

File tree

7 files changed

+121
-23
lines changed

7 files changed

+121
-23
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ android {
1818
targetSdkVersion Integer.parseInt("$targetSdkVer")
1919
versionCode Integer.parseInt("$verCode")
2020
versionName "$verName"
21+
multiDexEnabled true
2122
}
2223

2324
buildTypes {
@@ -117,6 +118,8 @@ dependencies {
117118
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
118119

119120
compile 'com.github.jd-alexander:LikeButton:0.1.8'
121+
122+
compile 'com.balysv.materialmenu:material-menu-toolbar:1.5.4'
120123
}
121124

122125
bugly {

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
<activity
6767
android:name=".ui.activity.BlocksActivity"
6868
android:label="@string/title_activity_blocks"
69-
android:theme="@style/AppTheme"/>
69+
android:theme="@style/AppTheme.NoActionBar.Transparent"/>
7070
<activity
7171
android:name=".ui.activity.UserActivity"
7272
android:label="@string/title_activity_user"

app/src/main/kotlin/com/rayfantasy/icode/ui/activity/BlocksActivity.kt

Lines changed: 89 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
package com.rayfantasy.icode.ui.activity
22

3+
import android.animation.Animator
4+
import android.animation.AnimatorListenerAdapter
5+
import android.app.Activity
36
import android.databinding.DataBindingUtil
7+
import android.graphics.Color
48
import android.os.Bundle
9+
import android.view.View
10+
import android.view.animation.DecelerateInterpolator
11+
import com.balysv.materialmenu.MaterialMenuDrawable
512
import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator
613
import com.rayfantasy.icode.R
714
import com.rayfantasy.icode.databinding.ActivityBlocksBinding
@@ -18,8 +25,19 @@ import org.jetbrains.anko.startActivity
1825
import org.jetbrains.anko.toast
1926

2027
class 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
}

app/src/main/kotlin/com/rayfantasy/icode/ui/adapter/CodeListAdapter.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ import com.rayfantasy.icode.extension.inflate
2626
import com.rayfantasy.icode.extension.loadPortrait
2727
import com.rayfantasy.icode.model.ICodeTheme
2828
import com.rayfantasy.icode.postutil.bean.CodeGood
29-
import com.rayfantasy.icode.ui.activity.BlocksActivity
3029
import com.rayfantasy.icode.ui.activity.UserActivity
30+
import com.rayfantasy.icode.ui.activity.startBlockActivity
3131
import com.rayfantasy.icode.util.ms2RelativeDate
3232
import kotlinx.android.synthetic.main.item_recycler_code_list.view.*
3333
import org.jetbrains.anko.onClick
@@ -58,7 +58,15 @@ class CodeListAdapter(val activity: Activity, var codeGoods: MutableList<CodeGoo
5858
}*/
5959

6060
holder.bg.onClick {
61-
activity.startActivity<BlocksActivity>("codeGood" to codeGood)
61+
holder.bg.startBlockActivity(codeGood)
62+
/*val location = intArrayOf(0,0)
63+
holder.bg.getLocationOnScreen(location)
64+
val y = location[1]
65+
val height = holder.bg.height
66+
activity.startActivity<BlocksActivity>("codeGood" to codeGood,
67+
"y" to y.toFloat(),
68+
"height" to height.toFloat())
69+
activity.overridePendingTransition(0, 0)*/
6270
}
6371
}
6472

app/src/main/kotlin/com/rayfantasy/icode/ui/adapter/UserListAdapter.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@ import com.rayfantasy.icode.extension.loadPortrait
1616
import com.rayfantasy.icode.extension.shadowColor
1717
import com.rayfantasy.icode.postutil.PostUtil
1818
import com.rayfantasy.icode.postutil.bean.CodeGood
19-
import com.rayfantasy.icode.ui.activity.BlocksActivity
19+
import com.rayfantasy.icode.ui.activity.startBlockActivity
2020
import com.rayfantasy.icode.util.ms2RelativeDate
2121
import jp.wasabeef.glide.transformations.CropCircleTransformation
2222
import kotlinx.android.synthetic.main.footer_recycler_view.view.*
2323
import kotlinx.android.synthetic.main.item_recycler_code_list.view.*
2424
import kotlinx.android.synthetic.main.item_recycler_user.view.*
2525
import org.jetbrains.anko.image
2626
import org.jetbrains.anko.onClick
27-
import org.jetbrains.anko.startActivity
2827

2928
/**
3029
* Created by qweas on 2016/1/22 0022.
@@ -93,9 +92,7 @@ class UserListAdapter(val activity: Activity, var username: String, var codeGood
9392
holder.subTitle.setTextColor(Color.rgb(140, 140, 140))
9493
}
9594
holder.pic.loadPortrait(username)
96-
holder.bg.onClick {
97-
activity.startActivity<BlocksActivity>("codeGood" to codeGood)
98-
}
95+
holder.bg.onClick { holder.bg.startBlockActivity(codeGood, false) }
9996
}
10097
is FooterViewHolder -> {
10198
setFooterState(FOOTER_STATE_LOADING)
Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
3-
xmlns:app="http://schemas.android.com/apk/res-auto"
4-
xmlns:tools="http://schemas.android.com/tools"
5-
android:id="@+id/recyclerView"
6-
android:layout_width="match_parent"
7-
android:layout_height="match_parent"
8-
app:layout_behavior="@string/appbar_scrolling_view_behavior"
9-
tools:context=".ui.activity.BlocksActivity"
10-
tools:showIn="@layout/activity_blocks"/>
2+
<android.support.v7.widget.RecyclerView
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:app="http://schemas.android.com/apk/res-auto"
5+
xmlns:tools="http://schemas.android.com/tools"
6+
android:id="@+id/recyclerView"
7+
android:layout_width="match_parent"
8+
android:layout_height="match_parent"
9+
app:layout_behavior="@string/appbar_scrolling_view_behavior"
10+
tools:context=".ui.activity.BlocksActivity"
11+
tools:showIn="@layout/activity_blocks"
12+
android:background="?android:colorBackground"/>

app/src/main/res/values/styles.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
<item name="windowNoTitle">true</item>
1717
</style>
1818

19+
<style name="AppTheme.NoActionBar.Transparent">
20+
<item name="android:windowBackground">@android:color/transparent</item>
21+
<item name="android:windowIsTranslucent">true</item>
22+
</style>
23+
1924
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
2025

2126
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>

0 commit comments

Comments
 (0)