앱을 만들다보면 DIalog를 만들때다 종종 있다. 그럴때 어떻게 해야하는지
코드로 알아보자.
아래는 실제 Dialog 코드다.
class MyDialog(context: Context, layoutId: Int) : Dialog(context) {
var detector: GestureDetector? = null // 다이얼로그가 나와있을때 손가락 제스쳐에 따른 행동을 구현하기 위함
protected var mContext: Context
private val iv: ImageView
private val text: String
companion object {
private const val SWIPE_MIN_DISTANCE = 120 // 제스쳐에 사용될 상수
private const val SWIPE_THRESHOLD_VELOCITY = 200// 제스쳐에 사용될 상수
}
init { // kotlin 에서 사용되는 초기화 구간
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(layoutId)
mContext = context
iv = findViewById<View>(R.id.iv) as ImageView // dialog 에서 사용할 이미지뷰 초기화
setCancelable(true) //dialog가 취소가 되는지
setCanceledOnTouchOutside(true) // 바깥화면을 눌렀을때 닫기는지 설정
//손가락 제스쳐에 따른 행동들 구현
detector = GestureDetector(context, object : GestureDetector.OnGestureListener {
override fun onDown(e: MotionEvent): Boolean {
return false
}
override fun onShowPress(e: MotionEvent) {}
override fun onSingleTapUp(e: MotionEvent): Boolean {
return false
}
override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float
): Boolean {
return false
}
override fun onLongPress(e: MotionEvent) {}
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
if (e2.y - e1.y > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
dismiss()
}
return true
}
})
// 다이얼로그의 크기를 조정 할 수 있음.
val window = window // dialog 의 window 를 알아옴.
if (window != null) {
val params = window.attributes
// 화면에 띄울 크기
params.width = WindowManager.LayoutParams.MATCH_PARENT // 크기를 이렇게 조정가능
params.height = WindowManager.LayoutParams.WRAP_CONTENT
// 다이얼로그 뒤 배경 Capacity
params.dimAmount = 0.4f // 다이얼로그가 나왔을때 뒷배경의 투명도를 조정
// 열기&닫기 시 애니메이션 설정
params.windowAnimations = R.style.AnimationBottomPopupStyle // 본인이 애니메이션을 만들었다면 이렇게
window.attributes = params
// 다이얼로그 뒷 배경 투명
window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
// UI 하단 정렬
window.setGravity(Gravity.BOTTOM)
}
}
}
그럼 액티비티에서 사용은 어떻게 할까?
이렇게 선언을 하고
var myDialog = MyDialog(this, layout.my_qr_layout)
onCreate() 안에서
myDialog .show() 로 실행하면 다이얼로그가 나온다.
애니메이션의 경우는 나는
themes.xml 에서
<style name="AnimationBottomPopupStyle">
<item name="android:windowEnterAnimation">@anim/open_bottom</item>
<item name="android:windowExitAnimation">@anim/close_bottom</item>
</style>
이렇게 만들어주고 res 폴더아래 anim 폴더를 만들고 그 아래에
밑의 두 파일을 생성해줬다.
open_bottom.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate
android:fromYDelta="100%"
android:toYDelta="0%"
android:duration="200"/>
</set>
close_bottom.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate
android:fromYDelta="0%"
android:toYDelta= "100%"
android:duration="200"/>
</set>
이 코드만 있어도 간단한 DIalog 를 사용할 수 있다~
'Android' 카테고리의 다른 글
videoview 화면에 full 화면으로 영상크기 맞추는 코드 (0) | 2021.09.16 |
---|---|
Fragment 에서 Activity의 finsh() 기능 만들기 (0) | 2021.08.31 |
android 10 대비하여 scopedStorage 구현 (0) | 2021.08.26 |
Drawable Shape 코드로 색상 동적 변경 (0) | 2021.07.31 |
팝업 프래그먼트 만들기 (0) | 2021.06.24 |
안드로이드에서 Dialog 버튼 결과를 액티비티에서 콜백 받기 (0) | 2021.05.21 |
레이아웃을 이미지로 변경하고 pdf로도 저장하기 (0) | 2021.05.13 |
안드로이드 라이프사이클(android lifecycle) (0) | 2021.05.01 |