Skip to content

Instantly share code, notes, and snippets.

View PatrykAndroid's full-sized avatar

PatrykAndroid

View GitHub Profile
dependencies {
...
implementation "androidx.viewpager2:viewpager2:1.0.0"
...
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
class Item(val color: Int)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/item"
class PageAdapter(private val items: List<Item>) : RecyclerView.Adapter<PageAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.item.setBackgroundColor(items[position].color)
}
override fun getItemCount(): Int {
if (items.size <= 1) {
return items.size
}
val period = Int.MAX_VALUE / 2 / items.size
return period * items.size * 2
}
class PageAdapter(private val items: List<Item>) : RecyclerView.Adapter<PageAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.item.setBackgroundColor(items[getRealPosition(position)].color)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initViewPager()
}
private fun initViewPager() {
val pageAdapter = PageAdapter(listOf(Item(Color.RED), Item(Color.BLUE), Item(Color.GREEN)))
viewPager2.offscreenPageLimit = 2
viewPager2.orientation = ViewPager2.ORIENTATION_VERTICAL
class PageTransformer : ViewPager2.PageTransformer {
companion object {
private const val SCALE = 0.9f
}
override fun transformPage(view: View, position: Float) {
val translationOffset = calculateTranslationOffset(view, position)
with(view) {
when {
position < -2.5 -> {
private fun initViewPager() {
val pageAdapter = PageAdapter(listOf(Item(Color.RED), Item(Color.BLUE), Item(Color.GREEN)))
viewPager2.setPageTransformer(PageTransformer())
viewPager2.offscreenPageLimit = 2
viewPager2.orientation = ViewPager2.ORIENTATION_VERTICAL
viewPager2.adapter = pageAdapter
viewPager2.currentItem = pageAdapter.getMiddlePosition()
}