Android ViewPager2自定義頁面切換動畫
阿新 • • 發佈:2021-01-19
預設切換動畫
- MainActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
binding.viewpager2.adapter = ViewPagerAdapter(this)
//binding.viewpager2.setPageTransformer(ViewPagerOverlay())
}
- Adapter
package im.zebra.myviewpager2
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
class ViewPagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
private val list = arrayOf(
"微信" ,
"通訊錄",
"發現",
"我的"
)
override fun getItemCount(): Int = list.size
override fun createFragment(position: Int): Fragment =
BlankFragment.newInstance(list[position], "")
}
自定義動畫(縮放)
- binding.viewpager2.setPageTransformer(ViewPagerScale())
package im.zebra.myviewpager2
import android.view.View
import androidx.viewpager2.widget.ViewPager2
import kotlin.math.abs
private const val MIN_SCALE = 0.75f
class ViewPagerScale : ViewPager2.PageTransformer {
override fun transformPage(view: View, position: Float) {
val pageWidth = view.width
when {
position < -1 -> { // [-Infinity,-1)
// This page is way off-screen to the left.
view.alpha = 0f
}
position <= 0 -> { // [-1,0]
// Use the default slide transition when moving to the left page
view.alpha = 1F
view.translationX = 0f
view.scaleX = 1f
view.scaleY = 1f
}
position <= 1 -> { // (0,1]
// Fade the page out.
view.alpha = 1 - position
// Counteract the default slide transition
view.translationX = pageWidth * -position
// Scale the page down (between MIN_SCALE and 1)
val scaleFactor: Float = (MIN_SCALE
+ (1 - MIN_SCALE) * (1 - abs(position)))
view.scaleX = scaleFactor
view.scaleY = scaleFactor
}
else -> { // (1,+Infinity]
// This page is way off-screen to the right.
view.alpha = 0f
}
}
}
}
自定義動畫(疊加)
- binding.viewpager2.setPageTransformer(ViewPagerOverlay())
package im.zebra.myviewpager2
import android.view.View
import androidx.viewpager2.widget.ViewPager2
import kotlin.math.abs
private const val MIN_SCALE = 1f
class ViewPagerOverlay : ViewPager2.PageTransformer {
override fun transformPage(view: View, position: Float) {
val pageWidth = view.width
when {
position < -1 -> { // [-Infinity,-1)
// This page is way off-screen to the left.
view.alpha = 0f
}
position <= 0 -> { // [-1,0]
// Use the default slide transition when moving to the left page
view.alpha = 1F
view.translationX = 0f
view.scaleX = 1f
view.scaleY = 1f
}
position <= 1 -> { // (0,1]
// Fade the page out.
view.alpha = 1 - position
// Counteract the default slide transition
view.translationX = pageWidth * -position
// Scale the page down (between MIN_SCALE and 1)
val scaleFactor: Float = (MIN_SCALE
+ (1 - MIN_SCALE) * (1 - abs(position)))
view.scaleX = scaleFactor
view.scaleY = scaleFactor
}
else -> { // (1,+Infinity]
// This page is way off-screen to the right.
view.alpha = 0f
}
}
}
}