2016-10-31 1 views
0

Fresco 라이브러리를 사용하여 RecyclerView 및 Android에서 애니메이션 gif 파일을 표시합니다.Android에서 Fresco로 Gif 미리보기 표시 (예 : 첫 번째 프레임)

DraweeController controller = Fresco.newDraweeControllerBuilder() 
       .setUri(url) 
       .setAutoPlayAnimations(true) 
       .build(); 
simpleDraweeView.setController(controller); 

모든 것은 괜찮지 만, GIF 이미지 캐시와 나는 위 또는 아래로 스크롤 할 때 다시로드되지 않은 것 같습니다 : 내 코드는 매우 간단하다, 나는 onBindViewHolder()에서이 작업을 수행. 그래서 간단한 이미지처럼 GIF 파일 미리보기를 보여 주기로했습니다. ImageRequest의 setLocalThumbnailPreviewsEnabled (true)가 GIF 이미지에서 작동하지 않는 것 같습니다. 그런 다음 setForceStaticImage (true)와 함께 ImageDecodeOptionsBuilder를 사용하려고했습니다. 정적 이미지로 GIF를 표시합니다 (거의 필요한 부분이지만 정적 이미지가로드 된 후 애니메이션을 시작해야합니다).

Uri imageUri = Uri.parse(url); 
    ImageDecodeOptionsBuilder decodeOptionsBuilder = new ImageDecodeOptionsBuilder(); 
    decodeOptionsBuilder.setForceStaticImage(true); 
    decodeOptionsBuilder.setDecodePreviewFrame(true); 
    ImageDecodeOptions imageDecodeOptions = new ImageDecodeOptions(decodeOptionsBuilder); 
    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(imageUri) 
      .setImageDecodeOptions(imageDecodeOptions) 
      .setLocalThumbnailPreviewsEnabled(true) 
      .build(); 

    DraweeController controller = Fresco.newDraweeControllerBuilder() 
      .setImageRequest(request) 
      .setAutoPlayAnimations(true) 
      .build(); 
    simpleDraweeView.setController(controller); 

가 나는 또한 setAutoPlayAnimations (참/거짓) 및 (decodeOptionsBuilder.setDecodePreviewFrame) (참과 같은) 다른 매개 변수와 함께 여전히 성공하지 재생하려고 : 다음은 내 코드입니다.

내 질문은 : GIF의 미리보기 이미지 (예 : 자리 표시 자)로 정적 이미지를 어떻게 표시 할 수 있습니까? GIF의 첫 프레임 (또는 다른 프레임)이라면 멋질 것입니다. 어떤 도움을 주셔서 감사합니다. 당신이 설명

답변

1

이 작업을 수행하는 가장 쉬운 방법은 다음과 같습니다

당신이 정적 이미지를 강제로 GIF를 설정합니다. 애니메이션을 재생하려면 (예 : 탭) 이미지를 다시 설정하지만 이번에는 setAutoPlayAnimations으로 설정하십시오.

대안으로

, 당신은 또한 기본적으로,이 같은 컨트롤러 구축 https://github.com/facebook/fresco/blob/master/samples/animation/src/main/java/com/facebook/samples/animation/MainActivity.java#L131

를 참조 자동으로 애니메이션을 시작하지만 꼭지를 시작할 수 없습니다 : 불행하게도

DraweeController gifController = Fresco.newDraweeControllerBuilder() 
    .setUri(animatedGifUri) 
    .setControllerListener(new BaseControllerListener<ImageInfo>() { 
     @Override 
     public void onFinalImageSet(
      String id, 
      ImageInfo imageInfo, 
      Animatable anim) { 
     if (anim != null) { 
      // start the animation with anim.start() whenever you want 
     } 
     } 
    }) 
    .build(); 

을, 아니 현재이 이것을하는 더 좋은 방법. 그러나 미래의 프레스코 (Fresco) 애니메이션 API를 개선하기 위해 노력하고 있습니다.

+0

안녕하세요 알렉산더, 답변 해 주셔서 감사합니다. 기본적으로 setAutoPlayAnimations (true)를 사용하고 GIF 애니메이션을 자동으로 재생하기를 원합니다. 예를 들어, giphy 앱과 같아야합니다 (탭으로 시작하지 마세요) - https://play.google.com/store/apps/details?id=com.giphy.messenger. 물론, 그들은 아마도 다른 이미지 로더 라이브러리를 사용할 것입니다.하지만 프레스코를 사용하고 싶습니다. (더 좋아합니다) 비슷한 동작을 구현합니다. 프레스코와 관련해서, 위/아래로 스크롤 할 때 이미지 대신 자리 표시자가 나타납니다. 나는 GIF를보기를 좋아하지만, 정적 인 이미지 (* .jpeg, .png 등) 만보고 싶다고 가정 해 봅시다. – Evgen

+0

옵션으로 GIF의 일부 프레임 일 수 있습니다. 그래서 지금 프레스코 화로 이것을 구현하는 것이 불가능하다는 뜻입니까? 아마도 onFinalImageSet() 또는 다른 것을 사용하여 정적 이미지를로드 한 후에 SimpleDraweeView의 정적 이미지를 GIF로 변경하는 방법이 있을까요? 또는 같은 위치에서 두 번째 SimpleDraweeView for GIF를 사용하여 보이게하고 조금 후에 (사용자가 스크롤을 멈춘 후에) 애니메이션을 시작 하시겠습니까? – Evgen

+0

그래서 나에게는 색이 지정된 플레이스 홀더와 GIF가 GIF로 표시된다. 이것은 간단한 컬러 플레이스 홀더 drawable로 할 수 있습니다. 대체 1 : 원할 때마다 수동으로 애니메이션을 수동으로 시작하십시오 (예 : 화면이 일정 시간 동안 화면에 표시된 경우 - 위의 내 솔루션 참조). 대체 2 : 애니메이션이있는 lowResImageUri를 설정하고 애니메이션이있는 일반 NormalResImageUri를 설정하십시오. 그러나, 나는 이것으로 이익을 보지 못한다. –

관련 문제