2013-11-04 2 views
1

현재 영화를 사용하여 사용자 정의보기에서 gif 이미지를 표시하려고합니다. 말 그대로이 작업을 수행하는 가장 일반적인 방법을 사용했습니다 :이 내 휴대 전화 (넥서스 4가 실행 API 18)에 GIF의 첫 번째 프레임을 표시왜 내 GIF 이미지에 애니메이션이 적용되지 않습니까?

public class GifView extends View { 

    private Movie movie; 
    private long timeElapsed; 

    public GifView(Context context) { 
     super(context); 
     init(); 
    } 

    public GifView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public GifView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
     timeElapsed = 0; 
     setImage(getResources().openRawResource(R.drawable.sample)); 
    } 

    public void setImage(byte[] bytes) { 
     movie = Movie.decodeByteArray(bytes, 0, bytes.length); 
     invalidate(); 
    } 

    public void setImage(InputStream is) { 
     movie = Movie.decodeStream(is); 
     invalidate(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.TRANSPARENT); 
     super.onDraw(canvas); 

     long now = android.os.SystemClock.uptimeMillis(); 
     if (timeElapsed == 0) { // first time 
      timeElapsed = now; 
     } 
     if (movie != null) { 
      int dur = movie.duration(); 
      if (dur == 0) { 
       dur = 1000; 
      } 
      int relTime = (int)((now - timeElapsed) % dur); 
      movie.setTime(relTime); 
      movie.draw(canvas, getWidth() - movie.width(), getHeight() - movie.height()); 
      invalidate(); 
     } 
    } 
} 

. 이보기의 hardwareAcceleration을 비활성화하면 표시되도록 설정해야합니다 (관련된 선을 제거해도 아무 것도 표시되지 않음). 다른 GIF 이미지를 사용해 보았는데 같은 결과가 나왔습니다. 내가 알아 차 렸던 한 가지는 movie.getDuration()이 항상 0을 반환한다는 것입니다. 이상하게 들릴까요? 아이디어가 있으십니까?

+0

당신의 GIF는 자원이기 때문에, 당신은'AnimationDrawable' 및 프레임의 시리즈로 GIF 변환 내'gif2animdraw' 스크립트를 사용하는 것이 좋습니다 : https://gist.github.com/commonsguy/6757059 – CommonsWare

+0

흥미 롭지 만이 드로어 블을 테스트 용으로 만 사용하고 있습니다. 결국 웹 요청에서 검색된 GIF를 보여줄 수 있기를 원합니다. –

+0

아, 그래, 내 시나리오는 그 시나리오를 도와 줄 수 없습니다. 죄송합니다. – CommonsWare

답변

0

안드로이드에서 GIF를 올바르게 실행해야한다면 프레임 워크가 네이티브 형식을 지원하지 않기 때문에 세 번째 라이브러리를 사용해야한다고 생각합니다. 안드로이드 비동기 네트워킹 제작 쉬운 : 애니메이션 GIF를 지원하고 더 나은 밀도 관리를

  • ION을 포함 안드로이드의 이미지 뷰의 확장 : 당신이에 관심이있을 수있는 프로젝트의 몇

    • ImageViewEx

      이다. GIF는 few days ago을 지원하며 원격 GIF를 다운로드하고 표시하는 데 적합합니다.

  • +0

    답변 해 주셔서 감사합니다. 위의 코드는 첫 번째 라이브러리와 동일한 접근 방식을 사용합니다. 두 번째 라이브러리는 Java gif 디코더를 사용합니다. 나는 어제 그것을 시험해 보았다. 그리고 어떻게 든이 두 번째 길은 일하고있다. 이 두 라이브러리가 내 필요에 과잉 인만큼 내 자신의 방식을 구현할 것입니다. 어쨌든 귀하의 의견을 보내 주셔서 감사합니다. –

    관련 문제