ViewPager2는 ViewPager의 개선된 버전이다.
* 변경 사항
1. 세로 페이징 지원 (android:orientation 속성 이용)
2. 오른쪽에서 왼쪽 페이징 지원 (android:layoutDirection 속성 이용)
3. 런타임에 프래그먼트 컬랙션을 수정 가능
4. DiffUtil 클래스에 엑세스 가능 (RecyclerView 데이터세트 변경 애니메이션 활용 가능)
* 구현 해야할 것
1. ViewPager에 들어갈 Fragment
- Fragment 클래스와 XML
2. ViewPager를 포함할 Activity
- Layout XML에는 ViewPager2를 추가, Activity에서는 Adapter 구현
3. (선택) Page 전환 애니메이션
하나씩 코드로 살펴보자
1. ViewPager에 들어갈 Fragment
- XML
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/txt"
style="?android:textAppearanceMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:padding="16dp"
android:textColor="#FFFFFF"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:text="다음"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/txt"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
- Fragment
class TutorialSlidePageFragment(position: Int) : Fragment() {
val position = position
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View{
var view = inflater.inflate(R.layout.fragment_screen_slide_page, container, false)
view.txt.text = position.toString()
when(position){
0 -> view.setBackgroundColor(Color.parseColor("#b9fffc"))
1 -> view.setBackgroundColor(Color.parseColor("#a3d8f4"))
2 -> view.setBackgroundColor(Color.parseColor("#9ab3f5"))
3 -> {
view.setBackgroundColor(Color.parseColor("#7579e7"))
view.btn.visibility = View.VISIBLE
view.btn.setOnClickListener {
startActivity(Intent(context, MainActivity::class.java))
}
}
}
return view
}
}
XML에는 TextView와 Button만 추가해주었고 페이지를 바꿀 때마다 배경색을 바꿔주었다. (버튼은 왜 해놨지)
지금은 1개만 해놨지만 페이지 마다 다른 Layout으로 구성하고 싶다면 그만큼 만들어주고,
Activity에서 Adapter에서 추가해주면 된다.
2. ViewPager를 포함할 Activity
- XML
<?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"
tools:context=".common.Tutorial.TutorialActivity">
<androidx.viewpager2.widget.ViewPager2
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
- Activity
private const val NUM_PAGES = 4
class TutorialActivity : FragmentActivity() {
private lateinit var viewPager: ViewPager2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_tutorial)
viewPager = findViewById(R.id.pager)
viewPager.setPageTransformer(DepthPageTransformer())
val pagerAdapter = ScreenSlidePagerAdapter(this)
viewPager.adapter = pagerAdapter
}
override fun onBackPressed() {
if (viewPager.currentItem == 0) {
super.onBackPressed()
} else {
viewPager.currentItem = viewPager.currentItem - 1
}
}
private inner class ScreenSlidePagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
override fun getItemCount(): Int =
NUM_PAGES
override fun createFragment(position: Int): Fragment =
TutorialSlidePageFragment(
position
)
}
}
XML에는 ViewPager2로 ViewPager가 들어갈 곳을 정해주자.
Activity에서는 Adpater를 만들어주고 createFragment에서 position(페이지 번호)에 맞는 fragment를 지정해주자.
* 위에서 말했드시 페이지마다 다른 Fragment를 지정하고 싶다면 여기서 position에 따라 지정해주자.
아래 3번에서 만들 애니메이션을 지정하고 싶다면 setPageTransformer로 지정해주자.
3. (선택) Page 전환 애니메이션
private const val MIN_SCALE = 0.75f
@RequiresApi(21)
class DepthPageTransformer : ViewPager2.PageTransformer {
override fun transformPage(view: View, position: Float) {
view.apply {
val pageWidth = width
when {
position < -1 -> { // [-Infinity,-1)
// This page is way off-screen to the left.
alpha = 0f
}
position <= 0 -> { // [-1,0]
// Use the default slide transition when moving to the left page
alpha = 1f
translationX = 0f
translationZ = 0f
scaleX = 1f
scaleY = 1f
}
position <= 1 -> { // (0,1]
// Fade the page out.
alpha = 1 - position
// Counteract the default slide transition
translationX = pageWidth * -position
// Move it behind the left page
translationZ = -1f
// Scale the page down (between MIN_SCALE and 1)
val scaleFactor = (MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)))
scaleX = scaleFactor
scaleY = scaleFactor
}
else -> { // (1,+Infinity]
// This page is way off-screen to the right.
alpha = 0f
}
}
}
}
}
참고 : developer.android.com/training/animation/screen-slide-2?hl=ko
'Android > 이것저것' 카테고리의 다른 글
[Android] 안드로이드에 Animation 적용하기! (0) | 2020.11.09 |
---|---|
[Android] 안드로이드 Room으로 로컬 데이터베이스 이용하기 (0) | 2020.10.25 |
[Android] Retrofit, HTTP 통신을 위한 라이브러리 (0) | 2020.07.27 |
[Android] Cleartext HTTP ~ bot permitted Error (0) | 2020.07.19 |
FloatingActionButton (0) | 2020.07.11 |
댓글