class MainActivity : AppCompatActivity() {
private val MIN_SCALE = 0.8f // 뷰가 몇퍼센트로 줄어들 것인지
private val MIN_ALPHA = 0.8f // 어두워지는 정도를 나타낸 듯 하다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val viewPager_idol : ViewPager2 = findViewById(R.id.viewPager_idol)
/* 여백, 너비에 대한 정의 */
val pageMarginPx = resources.getDimensionPixelOffset(R.dimen.pageMargin) // dimen 파일 안에 크기를 정의해두었다.
val pagerWidth = resources.getDimensionPixelOffset(R.dimen.pageWidth) // dimen 파일이 없으면 생성해야함
val screenWidth = resources.displayMetrics.widthPixels // 스마트폰의 너비 길이를 가져옴
val offsetPx = screenWidth - pageMarginPx - pagerWidth
viewPager_idol.setPageTransformer { page, position ->
page.translationX = position * -offsetPx
}
viewPager_idol.offscreenPageLimit = 1 // 몇 개의 페이지를 미리 로드 해둘것인지
viewPager_idol.adapter = ViewPagerAdapter(getIdolList()) // 어댑터 생성
viewPager_idol.orientation = ViewPager2.ORIENTATION_HORIZONTAL // 방향을 가로로
viewPager_idol.setPageTransformer(ZoomOutPageTransformer()) // 애니메이션 적용
}
// 뷰 페이저에 들어갈 아이템
private fun getIdolList(): ArrayList<Int> {
return arrayListOf<Int>(R.drawable.idol1, R.drawable.idol2, R.drawable.idol3)
}
/* 공식문서에 있는 코드 긁어온거임 */
inner class ZoomOutPageTransformer : ViewPager2.PageTransformer {
override fun transformPage(view: View, position: Float) {
view.apply {
val pageWidth = width
val pageHeight = height
when {
position < -1 -> { // [-Infinity,-1)
// This page is way off-screen to the left.
alpha = 0f
}
position <= 1 -> { // [-1,1]
// Modify the default slide transition to shrink the page as well
val scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position))
val vertMargin = pageHeight * (1 - scaleFactor) / 2
val horzMargin = pageWidth * (1 - scaleFactor) / 2
translationX = if (position < 0) {
horzMargin - vertMargin / 2
} else {
horzMargin + vertMargin / 2
}
// Scale the page down (between MIN_SCALE and 1)
scaleX = scaleFactor
scaleY = scaleFactor
// Fade the page relative to its size.
alpha = (MIN_ALPHA +
(((scaleFactor - MIN_SCALE) / (1 - MIN_SCALE)) * (1 - MIN_ALPHA)))
}
else -> { // (1,+Infinity]
// This page is way off-screen to the right.
alpha = 0f
}
}
}
}
}
}
순서보다는 예전 자바 뷰 페이저 2와 비슷한 방법인 것 같습니다.
메인에 뷰 페이저의 크기를 설정하고, 아이템을 받을 수 있게 어댑터를 연동합니다.
어댑터 부분을 보겠습니다.
class ViewPagerAdapter(idolList: ArrayList<Int>) : RecyclerView.Adapter<ViewPagerAdapter.PagerViewHolder>() {
var item = idolList
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = PagerViewHolder((parent))
override fun getItemCount(): Int = item.size
override fun onBindViewHolder(holder: PagerViewHolder, position: Int) {
holder.idol.setImageResource(item[position])
}
inner class PagerViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder
(LayoutInflater.from(parent.context).inflate(R.layout.idol_list_item, parent, false)){
val idol = itemView.findViewById<ImageView>(R.id.imageView_idol)!!
}
}