룬아님의 취중코딩

BottomSheetDialogFragment의 ScrollView에서 radius와 clip 적용하기 본문

개발/안드로이드 개발

BottomSheetDialogFragment의 ScrollView에서 radius와 clip 적용하기

룬아님 2020. 1. 20. 23:05

1. ScrollView에 투명 배경과 함께 radius를 적용한다.

 

detail_bottom_sheet_dialog_bgr.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners
        android:topLeftRadius="@dimen/radius_large"
        android:topRightRadius="@dimen/radius_large" />
    <solid android:color="@color/colorWhite" />
</shape>

 

styles.xml

<style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
    <item name="android:background">@drawable/detail_bottom_sheet_dialog_bgr</item>
</style>

<style name="BaseBottomSheetDialog" parent="@style/Theme.Design.Light.BottomSheetDialog">
    <item name="android:windowIsFloating">false</item>
    <item name="bottomSheetStyle">@style/BottomSheet</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

<style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog" />

 

ProductDetailFragment.kt

override fun getTheme(): Int = R.style.BottomSheetDialogTheme

 

그러면 radius를 적용했음에도 불구하고 scollview 안에 있는 아이템들이 fragment view 밖으로 벗어나 원하는 뷰가 나오지 않는다.

 

 

2. Scrollview에 radius 적용

@BindingAdapter("app:topRadius")
fun setScrollViewTopRadius(scrollView: ScrollView, radiusSize: Float) {
    scrollView.outlineProvider = object : ViewOutlineProvider() {
        override fun getOutline(view: View, outline: Outline) {
            outline.setRoundRect(
                0,
                0,
                view.width,
                view.height,
                radiusSize
            )
        }
    }
    scrollView.clipToOutline = true
}
<ScrollView
     android:id="@+id/scroll_view"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:scrollbars="none"
     app:topRadius="@{@dimen/spacing_large}">
     
     ....
     
     
</ScrollView>

outlineProvider를 커스텀하여 radius를 넣어주고 clipToOutline을 true로 해주면

이렇게 원했던 결과를 얻을 수 있다.

반응형
Comments