본문 바로가기
Project/안드로이드 프로젝트(RandomColorChart)

Android Studio, Kotiln] 11. 카메라 셔터st한 깜빡 애니메이션 구현

by 김마리님 2021. 3. 12.

안드로이드 jetpack cameraX로 카메라를 구현한다.

근데 이 때 좀.. 문제가 있는데, 셔터 애니메이션을 제공하지 않는다(!) 그래서 토스트 등으로 처리해주지 않으면 사진이 찍혔는지 아닌지 전혀 알 수가 없게 되어있다.

그래서 애니메이션을 구현했다(!)

 

 

먼저, 화면 위에 프레임 레이아웃을 하나 더 만들어줘야 한다.

 

...

    <FrameLayout
        android:id="@+id/frameLayoutShutter"
        android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_1E1E1E"/>


</androidx.constraintlayout.widget.ConstraintLayout>

 

이제 애니메이션을 anim 폴더에 생성한다.

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"

    >

    <alpha
        android:duration="100"
        android:fromAlpha="0"
        android:toAlpha="1"/>

    <alpha
        android:duration="100"
        android:startOffset="100"
        android:fromAlpha="1"
        android:toAlpha="0"/>


</set>

 

 

이 프레임을 애니메이션 시작 직전에 불러오고, 애니메이션이 끝나면 숨길 것이다.

기본적으로 valueAnimation은 콜백 리스너를 따로 제공하지 않기 때문에 애니메이션 리스너를 따로 만들어서 attach시켜줘야 한다.

 

애니메이션을 전역변수로 설정해놓고, 매서드로 전역변수에 애니메이션을 지정한다.

 

    private lateinit var cameraAnimationListener : Animation.AnimationListener
    
        private fun setCameraAnimationListener() {
        cameraAnimationListener = object : Animation.AnimationListener {
            override fun onAnimationStart(animation: Animation?) {
            }

            override fun onAnimationEnd(animation: Animation?) {
                frameLayoutShutter.visibility=View.GONE
            }

            override fun onAnimationRepeat(animation: Animation?) {

            }

        }
    }

 

이 매서드로 애니메이션이 끝날 때 뷰를 삭제시킬것이다.

 

이제 이 애니메이션을, value 애니메이션에 attach 시키면 된다.

 

            override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
                val savedUri = Uri.fromFile(photoFile)

                val animation = AnimationUtils.loadAnimation(this@CameraActivity, R.anim.camera_shutter)
                animation.setAnimationListener(cameraAnimationListener)
                frameLayoutShutter.animation = animation
                frameLayoutShutter.visibility=View.VISIBLE
                frameLayoutShutter.startAnimation(animation)


                DlogUtil.d(TAG, "imageCapture")
            }

 

반응형