Skip to content

Commit dd578f3

Browse files
authored
feat: Option to zoom into full covers (#476)
* Update full_cover_dialog.xml * Update FullCoverDialog.kt * Update FullCoverDialog.kt
1 parent 476c523 commit dd578f3

File tree

2 files changed

+63
-26
lines changed

2 files changed

+63
-26
lines changed

app/src/main/java/eu/kanade/tachiyomi/ui/manga/FullCoverDialog.kt

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@ import android.view.animation.DecelerateInterpolator
2323
import androidx.activity.BackEventCompat
2424
import androidx.activity.ComponentDialog
2525
import androidx.activity.OnBackPressedCallback
26-
import androidx.constraintlayout.widget.ConstraintLayout
26+
import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams
2727
import androidx.core.animation.addListener
28+
import androidx.core.animation.doOnEnd
2829
import androidx.core.content.ContextCompat
2930
import androidx.core.view.WindowInsetsCompat.Type.systemBars
3031
import androidx.core.view.WindowInsetsControllerCompat
32+
import androidx.core.view.isInvisible
33+
import androidx.core.view.isVisible
3134
import androidx.core.view.updateLayoutParams
3235
import androidx.transition.ChangeBounds
3336
import androidx.transition.ChangeImageTransform
@@ -122,27 +125,26 @@ class FullCoverDialog(val controller: MangaDetailsController, drawable: Drawable
122125
lastY = backEvent.touchY
123126
velocityTracker.addMovement(motionEvent)
124127
motionEvent.recycle()
125-
binding.mangaCoverFull.scaleX = 1f - maxProgress * 0.6f
126-
binding.mangaCoverFull.translationX =
128+
binding.mangaCoverZoom.scaleX = 1f - maxProgress * 0.6f
129+
binding.mangaCoverZoom.translationX =
127130
maxProgress * 100f * (if (backEvent.swipeEdge == BackEventCompat.EDGE_LEFT) 1 else -1)
128-
binding.mangaCoverFull.translationY = -maxProgress * 150f
129-
binding.mangaCoverFull.scaleY = 1f - maxProgress * 0.6f
131+
binding.mangaCoverZoom.translationY = -maxProgress * 150f
132+
binding.mangaCoverZoom.scaleY = 1f - maxProgress * 0.6f
130133
}
131134

132135
override fun handleOnBackCancelled() {
133-
binding.mangaCoverFull.scaleX = 1f
134-
binding.mangaCoverFull.translationX = 0f
135-
binding.mangaCoverFull.translationY = 0f
136-
binding.mangaCoverFull.scaleY = 1f
136+
binding.mangaCoverZoom.scaleX = 1f
137+
binding.mangaCoverZoom.translationX = 0f
138+
binding.mangaCoverZoom.translationY = 0f
139+
binding.mangaCoverZoom.scaleY = 1f
137140
}
138141
}
139142
onBackPressedDispatcher.addCallback(backPressedCallback)
140143

141-
binding.touchOutside.setOnClickListener {
142-
onBackPressedDispatcher.onBackPressed()
143-
}
144-
binding.mangaCoverFull.setOnClickListener {
145-
onBackPressedDispatcher.onBackPressed()
144+
listOf(binding.touchOutside, binding.mangaCoverFull, binding.mangaCoverZoom).forEach {
145+
it.setOnClickListener {
146+
onBackPressedDispatcher.onBackPressed()
147+
}
146148
}
147149

148150
binding.btnSave.setOnClickListener {
@@ -159,14 +161,15 @@ class FullCoverDialog(val controller: MangaDetailsController, drawable: Drawable
159161
.build()
160162

161163
expandedImageView.setImageDrawable(drawable)
164+
binding.mangaCoverZoom.setImageDrawable(drawable)
162165

163166
val rect = Rect()
164167
thumbView.getGlobalVisibleRect(rect)
165168
val systemInsets = activity?.window?.decorView?.rootWindowInsetsCompat?.getInsets(systemBars())
166169
val topInset = systemInsets?.top ?: 0
167170
val leftInset = systemInsets?.left ?: 0
168171
val rightInset = systemInsets?.right ?: 0
169-
expandedImageView.updateLayoutParams<ConstraintLayout.LayoutParams> {
172+
expandedImageView.updateLayoutParams<LayoutParams> {
170173
height = thumbView.height
171174
width = thumbView.width
172175
topMargin = rect.top - topInset
@@ -189,15 +192,17 @@ class FullCoverDialog(val controller: MangaDetailsController, drawable: Drawable
189192
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
190193
activity?.window?.decorView?.animateBlur(1f, 20f, 50)?.start()
191194
}
192-
expandedImageView.updateLayoutParams<ConstraintLayout.LayoutParams> {
193-
height = 0
194-
width = 0
195-
topMargin = defMargin + 48.dpToPx
196-
marginStart = defMargin
197-
marginEnd = defMargin
198-
bottomMargin = defMargin
199-
horizontalBias = 0.5f
200-
verticalBias = 0.5f
195+
listOf(expandedImageView, binding.mangaCoverZoom).forEach {
196+
it.updateLayoutParams<LayoutParams> {
197+
height = 0
198+
width = 0
199+
topMargin = defMargin + 48.dpToPx
200+
marginStart = defMargin
201+
marginEnd = defMargin
202+
bottomMargin = defMargin
203+
horizontalBias = 0.5f
204+
verticalBias = 0.5f
205+
}
201206
}
202207

203208
// TransitionSet for the full cover because using animation for this SUCKS
@@ -227,6 +232,12 @@ class FullCoverDialog(val controller: MangaDetailsController, drawable: Drawable
227232
}
228233
}
229234
playTogether(radiusAnimator, saveAnimator)
235+
doOnEnd {
236+
if (binding.touchOutside.isClickable) {
237+
binding.mangaCoverFull.isInvisible = true
238+
binding.mangaCoverZoom.isVisible = true
239+
}
240+
}
230241
duration = shortAnimationDuration
231242
interpolator = DecelerateInterpolator()
232243
start()
@@ -266,14 +277,21 @@ class FullCoverDialog(val controller: MangaDetailsController, drawable: Drawable
266277
}
267278
val rect2 = Rect()
268279
thumbView.getGlobalVisibleRect(rect2)
280+
binding.mangaCoverFull.scaleX = binding.mangaCoverZoom.scaleX
281+
binding.mangaCoverFull.translationX = binding.mangaCoverZoom.translationX
282+
binding.mangaCoverFull.translationY = binding.mangaCoverZoom.translationY
283+
binding.mangaCoverFull.scaleY = binding.mangaCoverZoom.scaleY
284+
binding.mangaCoverFull.isVisible = true
285+
binding.mangaCoverZoom.isVisible = false
286+
binding.mangaCoverZoom.isClickable = false
269287
binding.mangaCoverFull.isClickable = false
270288
binding.touchOutside.isClickable = false
271289
val expandedImageView = binding.mangaCoverFull
272290
val systemInsets = activity?.window?.decorView?.rootWindowInsetsCompat?.getInsets(systemBars())
273291
val topInset = systemInsets?.top ?: 0
274292
val leftInset = systemInsets?.left ?: 0
275293
val rightInset = systemInsets?.right ?: 0
276-
expandedImageView.updateLayoutParams<ConstraintLayout.LayoutParams> {
294+
expandedImageView.updateLayoutParams<LayoutParams> {
277295
height = thumbView.height
278296
width = thumbView.width
279297
topMargin = rect2.top - topInset

app/src/main/res/layout/full_cover_dialog.xml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,25 @@
3434
app:layout_constraintTop_toTopOf="parent"
3535
app:layout_constraintBottom_toTopOf="@id/button_container"/>
3636

37+
<com.github.chrisbanes.photoview.PhotoView
38+
android:id="@+id/manga_cover_zoom"
39+
android:layout_width="wrap_content"
40+
android:layout_height="wrap_content"
41+
android:scaleType="fitCenter"
42+
android:adjustViewBounds="true"
43+
android:visibility="invisible"
44+
tools:src="@mipmap/ic_launcher"
45+
android:contentDescription="@string/cover_of_image"
46+
android:layout_marginStart="16dp"
47+
android:layout_marginTop="16dp"
48+
android:layout_marginEnd="16dp"
49+
android:layout_marginBottom="16dp"
50+
app:layout_constraintHorizontal_bias="0.0"
51+
app:layout_constraintEnd_toEndOf="parent"
52+
app:layout_constraintStart_toStartOf="parent"
53+
app:layout_constraintTop_toTopOf="parent"
54+
app:layout_constraintBottom_toTopOf="@id/button_container"/>
55+
3756
<androidx.constraintlayout.widget.ConstraintLayout
3857
android:id="@+id/button_container"
3958
android:layout_width="0dp"
@@ -65,4 +84,4 @@
6584
android:text="@string/share"
6685
app:icon="@drawable/ic_share_24dp" />
6786
</androidx.constraintlayout.widget.ConstraintLayout>
68-
</androidx.constraintlayout.widget.ConstraintLayout>
87+
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)