kopia lustrzana https://github.com/ryukoposting/Signal-Android
Fix Z-ordering of preview media.
rodzic
41c7b47c2b
commit
4eb10faf49
|
@ -9,7 +9,7 @@ import androidx.viewpager2.widget.ViewPager2;
|
||||||
/**
|
/**
|
||||||
* Based on https://developer.android.com/training/animation/screen-slide#depth-page
|
* Based on https://developer.android.com/training/animation/screen-slide#depth-page
|
||||||
*/
|
*/
|
||||||
public final class DepthPageTransformer implements ViewPager.PageTransformer, ViewPager2.PageTransformer {
|
public final class DepthPageTransformer implements ViewPager.PageTransformer {
|
||||||
private static final float MIN_SCALE = 0.75f;
|
private static final float MIN_SCALE = 0.75f;
|
||||||
|
|
||||||
public void transformPage(@NonNull View view, float position) {
|
public void transformPage(@NonNull View view, float position) {
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
package org.thoughtcrime.securesms.animation
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
|
|
||||||
|
private const val MIN_SCALE = 0.75f
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lifted from https://developer.android.com/develop/ui/views/animations/screen-slide-2#depth-page
|
||||||
|
*/
|
||||||
|
@RequiresApi(21)
|
||||||
|
class DepthPageTransformer2 : ViewPager2.PageTransformer {
|
||||||
|
|
||||||
|
override fun transformPage(view: View, position: Float) {
|
||||||
|
view.apply {
|
||||||
|
val pageWidth = width
|
||||||
|
when {
|
||||||
|
position < -1 -> alpha = 0f
|
||||||
|
position <= 0 -> {
|
||||||
|
alpha = 1f
|
||||||
|
translationX = 0f
|
||||||
|
translationZ = 0f
|
||||||
|
scaleX = 1f
|
||||||
|
scaleY = 1f
|
||||||
|
}
|
||||||
|
position <= 1 -> {
|
||||||
|
alpha = 1 - position
|
||||||
|
|
||||||
|
translationX = pageWidth * -position
|
||||||
|
translationZ = -1f
|
||||||
|
|
||||||
|
val scaleFactor = (MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)))
|
||||||
|
scaleX = scaleFactor
|
||||||
|
scaleY = scaleFactor
|
||||||
|
}
|
||||||
|
else -> alpha = 0f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import androidx.viewpager2.widget.ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT
|
||||||
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
|
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
|
||||||
import com.google.android.material.appbar.MaterialToolbar
|
import com.google.android.material.appbar.MaterialToolbar
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
@ -26,7 +27,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import org.signal.core.util.concurrent.SignalExecutors
|
import org.signal.core.util.concurrent.SignalExecutors
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.animation.DepthPageTransformer
|
import org.thoughtcrime.securesms.animation.DepthPageTransformer2
|
||||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
|
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
|
||||||
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
||||||
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment
|
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment
|
||||||
|
@ -69,16 +70,7 @@ class MediaPreviewV2Fragment : Fragment(R.layout.fragment_media_preview_v2), Med
|
||||||
|
|
||||||
initializeViewModel(args)
|
initializeViewModel(args)
|
||||||
initializeToolbar(binding.toolbar, args)
|
initializeToolbar(binding.toolbar, args)
|
||||||
binding.mediaPager.offscreenPageLimit = 1
|
initializeViewPager()
|
||||||
binding.mediaPager.setPageTransformer(DepthPageTransformer())
|
|
||||||
val adapter = MediaPreviewV2Adapter(this)
|
|
||||||
binding.mediaPager.adapter = adapter
|
|
||||||
binding.mediaPager.registerOnPageChangeCallback(object : OnPageChangeCallback() {
|
|
||||||
override fun onPageSelected(position: Int) {
|
|
||||||
super.onPageSelected(position)
|
|
||||||
viewModel.setCurrentPage(position)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
initializeFullScreenUi()
|
initializeFullScreenUi()
|
||||||
initializeAlbumRail()
|
initializeAlbumRail()
|
||||||
anchorMarginsToBottomInsets(binding.mediaPreviewDetailsContainer)
|
anchorMarginsToBottomInsets(binding.mediaPreviewDetailsContainer)
|
||||||
|
@ -102,6 +94,21 @@ class MediaPreviewV2Fragment : Fragment(R.layout.fragment_media_preview_v2), Med
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun initializeViewPager() {
|
||||||
|
binding.mediaPager.offscreenPageLimit = OFFSCREEN_PAGE_LIMIT_DEFAULT
|
||||||
|
if (Build.VERSION.SDK_INT >= 21) {
|
||||||
|
binding.mediaPager.setPageTransformer(DepthPageTransformer2())
|
||||||
|
}
|
||||||
|
val adapter = MediaPreviewV2Adapter(this)
|
||||||
|
binding.mediaPager.adapter = adapter
|
||||||
|
binding.mediaPager.registerOnPageChangeCallback(object : OnPageChangeCallback() {
|
||||||
|
override fun onPageSelected(position: Int) {
|
||||||
|
super.onPageSelected(position)
|
||||||
|
viewModel.setCurrentPage(position)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
private fun initializeAlbumRail() {
|
private fun initializeAlbumRail() {
|
||||||
binding.mediaPreviewAlbumRail.itemAnimator = null // Or can crash when set to INVISIBLE while animating by FullscreenHelper https://issuetracker.google.com/issues/148720682
|
binding.mediaPreviewAlbumRail.itemAnimator = null // Or can crash when set to INVISIBLE while animating by FullscreenHelper https://issuetracker.google.com/issues/148720682
|
||||||
binding.mediaPreviewAlbumRail.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
|
binding.mediaPreviewAlbumRail.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
|
||||||
|
|
Ładowanie…
Reference in New Issue