Animation With lottie
by 김지운
lottie는 airbnb에서 공개한 android, ios, web(react-native)용 애니메이션 라이브러이다.
각 플랫폼 별 깃헙 레파지토리는 아래와 같다.
lottie-Document는 API에 대한 상세 내용 및 디자인 가이드 문서가 있다.
language | repository |
---|---|
android | lottie-android |
ios | lottie-ios |
react-native | lottie-react-native |
디자이너가 After Effects의 확장 플러그인인 Bodymovin을 사용해서 animation을 추출하면 lottie에서 사용할 수 있는
json형태의 데이터를 뽑을 수 있는데 이를 렌더할 수 있는 뷰를 제공하는 라이브러리이다.
개발자가 한땀한담 캔버스에 그리거나 혹은 대용량의 프레임용 리소스를 패키지에 포함하지 않더라도 깔끔한 애니메이션을 뽑을 수 있다.
물론 모든 After Effects의 기능을 활용 가능하진 않지만 최대한 지원 가능하도록 한다니 기대를 가져본다.
Android를 기준으로 코드를 보면 일단 gradle에 아래와 같이 dependency를 설정한다.
compile 'com.airbnb.android:lottie:2.3.0'
test_layout.xml
<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"
android:background="@color/standard_background"
tools:context="com.kmlwriter.kjw.myway.SplashActivity">
<com.airbnb.lottie.LottieAnimationView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/splash_animation_view"
app:lottie_fileName="world_locations.json"
app:lottie_autoPlay="true"
app:lottie_loop="true"
/>
</RelativeLayout>
android 네임스페이스에 있는 속성들을 제외하고 test_layout.xml을 보면
lottie_fileName : 애니메이션에 사용할 json파일 이름(asset에 추가된)
lottie_autoPlay : true or false로 자동 재생될건지에 대한 속성이다.
lottie_loop : true or false로 애니메이션을 반복할지에 대한 속성이다.
위 3가지 속성 외에도 lottie_progress, lottie_scale, … 이 있다.
당연하게도 해당 속성들에 대한 접근 API도 제공한다.
LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.splash_animation_view);
animationView.setAnimation("hello-world.json");
animationView.loop(true);
animationView.playAnimation();
와 같이 실행중 애니메이션 변경도 가능하며 반복, 재생, 취소등이 가능하며 ValueAnimator객채를 이용하여 재생속도 조절등 다양한 기능을 제공한다.
animationView.addAnimatorUpdateListener((animation) -> {
// Do something.
});
animationView.playAnimation();
...
if (animationView.isAnimating()) {
// Do something.
}
...
animationView.setProgress(0.5f);
...
// Custom animation speed or duration.
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f)
.setDuration(500);
animator.addUpdateListener(animation -> {
animationView.setProgress(animation.getAnimatedValue());
});
animator.start();
...
animationView.cancelAnimation();
애니메이션 제작에 걸리는 시간을 확실히 줄일 수 있으며 디자이너의 생각이 바로 반영될 수 있어서
좋다.
Subscribe via RSS