개발 업무를 하다 보면 webp를 프레임 별 나누어진 이미지로 받는 경우도 있지만,
동영상 형태로 받는 경우가 있다.
만약 최초 1회만 재생해야 하는 경우 (스플래쉬, 1회성 모션 등)
아래와 같이 다른 옵션 없이 Fresco를 통해 재생하는 경우 무한 반복하여 재생하게 된다.
DraweeController controller = Fresco.newDraweeControllerBuilder(){ ... //생략
simpleDraweeView.setController(controller);
이 포스팅에서는 webp의 재생 횟수를 명시해주기 위한 로직을 소개하려고 한다.
1. 첫 번째로는 DraweeController를 작성한다.
이 단계에서는 Fresco 객체를 생성하고, 이를 통해 drawable에 적용할 controller를 얻을 것이다.
집중해야 할 내용은 onFinalImageSet 안의 AnimatedDrawable2 클래스이다.
해당 클래스에서 본 포스팅의 핵심인 재생 횟수를 정할 수 있는 기능을 제공하고 있다.
첫째줄 코드의 drawableUri는 재생할 파일의 Uri이다.
그럼 AnimatedDrawable 객체에는 어떤 것이 들어가는지 2번에서 설명하겠다.
DraweeController setCntController = Fresco.newDraweeControllerBuilder().setUri(drawableUri)
.setAutoPlayAnimations(true)
.setControllerListener(new ControllerListener<ImageInfo>() {
@Override
public void onSubmit(String id, Object callerContext) {}
@Override
public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
AnimatedDrawable2 a = Utils.setLoopCount(animatable,loopCount);
a.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(AnimatedDrawable2 drawable) {}
@Override
public void onAnimationStop(AnimatedDrawable2 drawable) {}
@Override
public void onAnimationReset(AnimatedDrawable2 drawable) {}
@Override
public void onAnimationRepeat(AnimatedDrawable2 drawable) {}
@Override
public void onAnimationFrame(AnimatedDrawable2 drawable, int frameNumber) {}
});
}
@Override
public void onIntermediateImageSet(String id, ImageInfo imageInfo) {}
@Override
public void onIntermediateImageFailed(String id, Throwable throwable) {}
@Override
public void onFailure(String id, Throwable throwable) {}
@Override
public void onRelease(String id) {}
})
.build();
return controller;
}
2. 재생 횟수를 지정한 AnimatedDrawable2 객체를 생성한다.
해당 메소드에 Animatable 객체와 재생 횟수를 나타내는 loop카운트를 보내어,
아래와 같이 AnimatedDrawable2 객체를 생성한 뒤 리턴하여 1번의 onFinalImageSet에서 사용하는 것이다.
그 아래의 LoopCountModifyingBackend 클래스도 작성해주어야 한다.
public static AnimatedDrawable2 setLoopCount(@Nullable Animatable animatable, int loopCnt) {
AnimatedDrawable2 animatedDrawable = (AnimatedDrawable2) animatable;
animatedDrawable.setAnimationBackend(new LoopCountModifyingBackend(animatedDrawable.getAnimationBackend(), loopCnt));
return animatedDrawable;
}
public static class LoopCountModifyingBackend extends AnimationBackendDelegate {
private int mLoopCount;
public LoopCountModifyingBackend(
@Nullable AnimationBackend animationBackend,
int loopCount) {
super(animationBackend);
mLoopCount = loopCount;
}
@Override
public int getLoopCount() {
return mLoopCount;
}
}
3. 생성한 컨트롤러를 동일하게 view에 지정한다.
SimpleDraweeView simpleDraweeView = findViewById(R.id.view);
simpleDraweeView.setController(setCntController);
마무리
'JAVA > Android' 카테고리의 다른 글
[JAVA][Android] ImageView 영역에 원하는 radius값을 반영하는 setOutlineProvider (0) | 2022.06.21 |
---|---|
[JAVA][Android] ProgressBar 디자인 java 코드로 변경하기 (+ 변경 시 비가시화 처리 되는 현상 해결방법) (0) | 2022.05.26 |
[JAVA][Android] ProgressBar 부드럽게 증가/감소 시키기 : ObjectAnimator 활용 (0) | 2022.05.18 |
[JAVA][Android] 로컬 파일(png, webp 등)의 Uri 추출하기 (0) | 2022.05.17 |
[JAVA][Android] CountDownTimer 작동과 일시정지/재시작 (0) | 2022.05.16 |