@@ -35,8 +35,19 @@ class SwipePager @JvmOverloads constructor(
3535 fun onPageScrolled (position : Int , offset : Float ) {}
3636 }
3737
38+ /* *
39+ * Cho phép áp hiệu ứng chuyển trang tuỳ ý (fade, scale, depth...), tương tự
40+ * ViewPager.PageTransformer thế hệ 1. [position] là vị trí tương đối của trang so với
41+ * trang đang được chọn: 0 = đang hiển thị đầy đủ, -1 = lùi hẳn 1 trang bên trái,
42+ * 1 = lùi hẳn 1 trang bên phải.
43+ */
44+ interface PageTransformer {
45+ fun transformPage (page : View , position : Float )
46+ }
47+
3848 private val pages = ArrayList <View >()
3949 private var listener: OnPageChangeListener ? = null
50+ private var pageTransformer: PageTransformer ? = null
4051
4152 var currentItem: Int = 0
4253 private set
@@ -71,10 +82,43 @@ class SwipePager @JvmOverloads constructor(
7182 listener = l
7283 }
7384
85+ fun setPageTransformer (transformer : PageTransformer ? ) {
86+ pageTransformer = transformer
87+ applyPageTransform()
88+ }
89+
90+ /* *
91+ * Áp hiệu ứng transform lên từng trang dựa theo vị trí hiện tại của scrollX.
92+ * Gọi lại mỗi khi scrollX đổi (kéo tay, fling, settle) hoặc khi layout/thêm trang.
93+ */
94+ private fun applyPageTransform () {
95+ if (width == 0 ) return
96+ val transformer = pageTransformer
97+ for (i in 0 until childCount) {
98+ val child = getChildAt(i)
99+ val position = (child.left - scrollX).toFloat() / width
100+ if (transformer != null ) {
101+ transformer.transformPage(child, position)
102+ } else {
103+ // Không có transformer -> đảm bảo trang luôn ở trạng thái gốc
104+ child.alpha = 1f
105+ child.scaleX = 1f
106+ child.scaleY = 1f
107+ child.translationX = 0f
108+ }
109+ }
110+ }
111+
112+ override fun onScrollChanged (l : Int , t : Int , oldl : Int , oldt : Int ) {
113+ super .onScrollChanged(l, t, oldl, oldt)
114+ applyPageTransform()
115+ }
116+
74117 fun addPage (view : View ) {
75118 pages.add(view)
76119 addView(view)
77120 requestLayout()
121+ applyPageTransform()
78122 }
79123
80124 fun getPageCount (): Int = pages.size
@@ -131,6 +175,7 @@ class SwipePager @JvmOverloads constructor(
131175 pendingItem = null
132176 scrollTo(target * w, 0 )
133177 }
178+ applyPageTransform()
134179 }
135180
136181 override fun onInterceptTouchEvent (ev : MotionEvent ): Boolean {
0 commit comments