๊พธ์ค€ํ•จ์ด ์ง„๋ฆฌ๋‹ค!!

์–ด์ œ๋ณด๋‹ค ๋ฐœ์ „ํ•œ ์˜ค๋Š˜์ด ๋˜๊ณ ํ”ˆ ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์˜ ๋ธ”๋กœ๊ทธ

Android/Kotlin

[Kotlin][Android] ์•ˆ๋“œ๋กœ์ด๋“œ ๋กœํ‹ฐ์• ๋‹ˆ๋ฉ”์ด์…˜(Lottie Animation) ํ™œ์šฉํ•˜๊ธฐ

๋ށ์š” 2022. 3. 21. 23:57

๋จผ์ € ๋กœํ‹ฐ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋ž€ After Effect์—์„œ ์ œ์ž‘ํ•œ Motion Graphic์„ ์–ดํ”Œ๋ฆฌ์ผ€์…˜์—์„œ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์จ OOM(OUT OF MEMORY)์— ๋Œ€ํ•ด์„œ๋„ ์‹ ๊ฒฝ์„ ๋งŽ์ด ์“ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

 

๋กœํ‹ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ์— ์•ž์„œ

๋ชจ๋“ˆ gradle ํŒŒ์ผ์— dependency๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

 

dependencies { 
... 
def lottieVersion = '์‚ฌ์šฉํ•  ๋ฒ„์ „'
implementation "com.airbnb.android:lottie:$lottieVersion"
... 
}

์œ„์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋˜๋ฉฐ ๊ธ€์“ด์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋‹น์‹œ ์ตœ์‹ ๋ฒ„์ „์„ ํ™œ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ์ •๋ณด๋Š” http://airbnb.io/lottie/#/android?id=sample-app๋ฅผ ํ†ตํ•ด ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 

 

Lottie Docs

 

airbnb.io

์œ„ ์‚ฌ์ดํŠธ์—์„œ documet๋ฅผ ๋ณด๋ฉด ์—ฌ๋Ÿฌ ์‚ฌ์šฉ๋ฒ•์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ๊ทธ์ค‘์— ์ปค์Šคํ…€ ์• ๋‹ˆ๋ฉ”์ด์…˜์— ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์‚ฌ์šฉํ•˜๊ณ ํ”ˆ lottie ์• ๋‹ˆ๋ฉ”์ด์…˜ ํŒŒ์ผ์„ ๋‚ด๋ ค ๋ฐ›์€ ํ›„ assetํด๋”์˜ ๋ณต์‚ฌํ•ด์ค๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด xml์„ ๊ตฌ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MainActivity">
    
    <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/like_button"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerInParent="true"
        app:lottie_autoPlay="false"
        app:lottie_fileName="heart.json"
        app:lottie_loop="false" />
        
</RelativeLayout>

 

KotlinํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค.

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        like_button.setOnClickListener {
            // ํด๋ฆญ ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜ 
            clickLikeButton()
        }
    }

 

 

 

 fun clickLikeButton() {
        if(!isLiked){
            //์ข‹์•„์š” ๋ˆ„๋ฅด์ง€ ์•Š์€ ์ƒํƒœ
            //ofFloat์€ ์‹คํ–‰ํ•  ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. (0f = 0% , 0.5f = 50%)
            //setDuration์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ์‹œ๊ฐ„์„ ์„ค์ •ํ•œ๋‹ค.ํƒœ
            //animator.start๋ฅผ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹คํ–‰
            val animator = ValueAnimator.ofFloat(0f, 0.5f).setDuration(1000)
            isLiked = true
            animator.addUpdateListener {
                //updateListener๋ฅผ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ฐฑ์‹ ๋˜๋„๋ก ํ•ด์ค€๋‹ค.
                //getAnimateValue ํ˜„์žฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๊ตฌ๊ฐ„์„ Object๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
                //setProgress๋Š” float๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›๊ธฐ์— ํ•ด๋‹น ๊ฐ’์„ float๊ฐ’์œผ๋กœ ์บ์ŠคํŒ… ํ•ด์ฃผ์—ˆ๋‹ค.
                like_button.setProgress(animator.getAnimatedValue() as Float)
            }
            animator.start()

        }
        else{
            //์ข‹์•„์š” ๋ˆ„๋ฅธ ์ƒํƒœ
            val animator = ValueAnimator.ofFloat(0.5f, 1.0f).setDuration(200)
            isLiked = false
            animator.addUpdateListener {
                like_button.setProgress(animator.getAnimatedValue() as Float)
            }
            animator.start()
        }
    }

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰ ํ™”๋ฉด์œผ๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.