Skip to content

Commit 5f2a4f8

Browse files
committed
Update
1 parent 76e7a1c commit 5f2a4f8

4 files changed

Lines changed: 71 additions & 71 deletions

File tree

app/src/main/java/com/tool/tree/MainActivity.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import com.omarea.krscript.ui.ParamsFileChooserRender
2929
import com.tool.tree.databinding.ActivityMainBinding
3030
import com.tool.tree.ui.MainPagerAdapter
3131
import com.tool.tree.ui.TabIconHelper
32-
import com.tool.tree.ui.FadeThroughPageTransformer
32+
import com.tool.tree.ui.TabZoomFadePageTransformer
3333
import kotlinx.coroutines.Dispatchers
3434
import kotlinx.coroutines.isActive
3535
import kotlinx.coroutines.launch
@@ -78,9 +78,9 @@ class MainActivity : AppCompatActivity() {
7878
adapter = MainPagerAdapter(this)
7979
binding.viewPager.adapter = adapter
8080
binding.viewPager.offscreenPageLimit = 4
81-
// Dùng hiệu ứng "Fade Through" (mờ dần, không trượt) khi chuyển tab,
82-
// thay cho hiệu ứng slide mặc định kiểu AOSP.
83-
binding.viewPager.setPageTransformer(FadeThroughPageTransformer())
81+
// Dùng hiệu ứng "Zoom + Fade" (thu nhỏ/mờ + phóng to/hiện rõ trong lúc trượt)
82+
// khi chuyển tab, thay cho hiệu ứng slide thuần kiểu AOSP.
83+
binding.viewPager.setPageTransformer(TabZoomFadePageTransformer())
8484
}
8585
}
8686

app/src/main/java/com/tool/tree/PredictiveBackHelper.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,12 @@ class PredictiveBackHelper(
4343
dispatcher.addCallback(activity, object : OnBackPressedCallback(true) {
4444

4545
override fun handleOnBackStarted(backEvent: BackEventCompat) {
46+
android.util.Log.d("PredictiveBack", "handleOnBackStarted called - edge=${backEvent.swipeEdge}")
4647
contentView.pivotY = contentView.height / 2f
4748
}
4849

4950
override fun handleOnBackProgressed(backEvent: BackEventCompat) {
51+
android.util.Log.d("PredictiveBack", "handleOnBackProgressed progress=${backEvent.progress}")
5052
val progress = backEvent.progress.coerceIn(0f, 1f)
5153

5254
val scale = 1f - (1f - minScale) * progress

app/src/main/java/com/tool/tree/ui/FadeThroughPageTransformer.kt

Lines changed: 0 additions & 67 deletions
This file was deleted.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.tool.tree.ui
2+
3+
import android.view.View
4+
import androidx.viewpager2.widget.ViewPager2
5+
import kotlin.math.abs
6+
import kotlin.math.max
7+
8+
/**
9+
* Hiệu ứng chuyển tab: vừa TRƯỢT (giữ chuyển động mặc định của ViewPager2, không "đóng băng"
10+
* translationX như bản trước) vừa THU NHỎ + MỜ DẦN với tab đang đi ra, và PHÓNG TO + HIỆN RÕ
11+
* DẦN với tab đang đi vào - giống hiệu ứng "Zoom Out" kinh điển của Google (ZoomOutPageTransformer)
12+
* chứ không phải fade-through đứng yên tại chỗ.
13+
*
14+
* position (do ViewPager2 cung cấp cho mỗi trang):
15+
* -1 = trang nằm hẳn bên trái màn hình hiện tại
16+
* 0 = trang đang hiển thị chính giữa màn hình
17+
* 1 = trang nằm hẳn bên phải màn hình hiện tại
18+
*
19+
* Trang càng lệch xa vị trí 0 (|position| tiến gần 1) thì càng nhỏ + càng mờ; khi về đúng
20+
* position = 0 thì full size (100%) + full alpha (100%).
21+
*/
22+
class TabZoomFadePageTransformer(
23+
// Kích thước nhỏ nhất khi trang đang ở rìa màn hình (|position| = 1).
24+
private val minScale: Float = 0.85f,
25+
// Độ mờ nhỏ nhất khi trang đang ở rìa màn hình (|position| = 1).
26+
private val minAlpha: Float = 0.5f
27+
) : ViewPager2.PageTransformer {
28+
29+
override fun transformPage(page: View, position: Float) {
30+
val pageWidth = page.width
31+
val pageHeight = page.height
32+
if (pageWidth == 0 || pageHeight == 0) return
33+
34+
page.apply {
35+
when {
36+
// Trang đã trôi ra ngoài hẳn 2 bên -> ẩn để khỏi tốn vẽ thừa.
37+
position < -1f || position > 1f -> {
38+
alpha = 0f
39+
}
40+
41+
else -> {
42+
// KHÔNG set translationX thủ công ở đây -> ViewPager2 vẫn tự trượt trang
43+
// theo đúng chuyển động mặc định (kéo tay/animation chuyển tab), khác hẳn
44+
// bản fade-through cũ (đóng băng translationX làm trang đứng im).
45+
val scaleFactor = max(minScale, 1f - abs(position))
46+
scaleX = scaleFactor
47+
scaleY = scaleFactor
48+
49+
// Bù lại phần lệch do scale từ tâm, để trang thu nhỏ vẫn "áp" đúng theo
50+
// hướng trượt thay vì bị lộ khoảng trống 2 bên khi scale nhỏ lại.
51+
val vertMargin = pageHeight * (1 - scaleFactor) / 2
52+
val horzMargin = pageWidth * (1 - scaleFactor) / 2
53+
translationX = if (position < 0) {
54+
(horzMargin - vertMargin / 2)
55+
} else {
56+
(-horzMargin + vertMargin / 2)
57+
}
58+
59+
// Mờ dần tỉ lệ thuận theo scale: scale càng nhỏ (càng lệch xa) thì càng mờ.
60+
alpha = minAlpha + (scaleFactor - minScale) / (1f - minScale) * (1f - minAlpha)
61+
}
62+
}
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)