[java] 애니메이션 GIF 표시

응용 프로그램에 애니메이션 GIF 이미지를 표시하고 싶습니다. 안드로이드가 애니메이션 GIF를 기본적으로 지원하지 않는 어려운 방법을 발견했습니다.

그러나 AnimationDrawable을 사용하여 애니메이션을 표시 할 수 있습니다 .

개발> 안내서> 이미지 및 그래픽> 드로어 블 개요

이 예제는 응용 프로그램 리소스에 프레임으로 저장된 애니메이션을 사용하지만 필요한 것은 애니메이션 GIF를 직접 표시하는 것입니다.

내 계획은 애니메이션 GIF를 프레임으로 나누고 각 프레임을 AnimationDrawable에 드로어 블로 추가하는 것입니다.

누구나 애니메이션 GIF에서 프레임을 추출하고 각 프레임을 Drawable 로 변환하는 방법을 알고 있습니까?



답변

Android는 실제로 android.graphics.Movie 클래스를 사용하여 애니메이션 GIF를 디코딩하고 표시 할 수 있습니다.

너무 많이 문서화되어 있지는 않지만 SDK Reference에 있습니다. 또한 BitmapDecode 예제의 ApiDemos 샘플에서 일부 애니메이션 플래그가 사용됩니다.


답변

최신 정보:

글라이드 사용 :

dependencies {
  implementation 'com.github.bumptech.glide:glide:4.0.0'
}

용법:

Glide.with(context).load(GIF_URI).into(new GlideDrawableImageViewTarget(IMAGE_VIEW));

문서를 참조하십시오


답변

또한 (main / assets / htmls / name.gif) [이 html로 크기를 조정하십시오.]

<html style="margin: 0;">
<body style="margin: 0;">
<img src="name.gif" style="width: 100%; height: 100%" />
</body>
</html>

Xml에서 다음과 같이 선언하십시오 (main / res / layout / name.xml) : [예를 들어 크기를 정의합니다]

<WebView
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/webView"
android:layout_gravity="center_horizontal" />

활동에서 다음 코드를 onCreate 안에 넣으십시오.

web = (WebView) findViewById(R.id.webView); 
web.setBackgroundColor(Color.TRANSPARENT); //for gif without background
web.loadUrl("file:///android_asset/htmls/name.html");

동적으로로드하려면 데이터와 함께 웹보기를로드해야합니다.

// or "[path]/name.gif" (e.g: file:///android_asset/name.gif for resources in asset folder), and in loadDataWithBaseURL(), you don't need to set base URL, on the other hand, it's similar to loadData() method.
String gifName = "name.gif";
String yourData = "<html style=\"margin: 0;\">\n" +
        "    <body style=\"margin: 0;\">\n" +
        "    <img src=" + gifName + " style=\"width: 100%; height: 100%\" />\n" +
        "    </body>\n" +
        "    </html>";
// Important to add this attribute to webView to get resource from outside.
webView.getSettings().setAllowFileAccess(true);

// Notice: should use loadDataWithBaseURL. BaseUrl could be the base url such as the path to asset folder, or SDCard or any other path, where your images or the other media resides related to your html
webView.loadDataWithBaseURL("file:///android_asset/", yourData, "text/html", "utf-8", null);
// Or if you want to load image from SD card or where else, here is the idea.
String base = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
webView.loadDataWithBaseURL(base + '/', yourData, "text/html", "utf-8", null);

제안 : 자세한 정보 확인을 위해 정적 이미지가있는 gif를로드하는 것이 좋습니다 https://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

그게 다야, 나는 당신이 도움이되기를 바랍니다.


답변

휴대 전화에 저장하기 전에 GIF 애니메이션을 프레임 으로 분할하여 문제를 해결 했으므로 Android에서 처리하지 않아도됩니다.

그런 다음 모든 프레임을 휴대 전화로 다운로드하고 Drawable을 만든 다음 AnimationDrawable 을 만듭니다. 제 질문의 예와 매우 비슷합니다.


답변

여기에서 훌륭하고 간단한 작업 예제를 통해 매우 쉬운 방법을 찾았습니다.

애니메이션 위젯 표시

그것이 작동하기 전에 코드에서해야 할 몇 가지 혼란이 있습니다.

다음에

    @Override
    public void onCreate(Bundle savedInstanceState){    
        super.onCreate(savedInstanceStated);   
        setContentView(new MYGIFView());
    }    
}

그냥 교체

setContentView(new MYGIFView());

setContentView(new MYGIFView(this));

그리고 안으로

public GIFView(Context context) {
    super(context);

나만의 gif 애니메이션 파일 제공

    is = context.getResources().openRawResource(R.drawable.earth);
    movie = Movie.decodeStream(is);
}

첫 번째 라인 교체

public MYGIFView(Context context) {

수업 이름에 따라 …

이 작은 변화가 끝나면 나처럼 작동해야합니다 …

이 도움을 바랍니다


답변

Android에서 애니메이션 GIF를 표시하는 방법 :

  • 영화 수업. 위에서 언급했듯이 상당히 버그가 있습니다.
  • WebView. 사용이 매우 간단하고 일반적으로 작동합니다. 그러나 때로는 잘못 작동하기 시작하고 항상 가지고 있지 않은 일부 모호한 장치에 있습니다. 또한 메모리에 영향을 미치기 때문에 모든 종류의 목록보기에서 여러 인스턴스를 사용할 수 없습니다. 여전히 주요 접근 방식으로 고려할 수 있습니다.
  • GIF를 비트 맵으로 디코딩하고 Drawable 또는 ImageView로 표시하는 사용자 지정 코드입니다. 두 개의 라이브러리를 언급하겠습니다.

https://github.com/koral–/android-gif-drawable- 디코더는 C로 구현되므로 매우 효율적입니다.

https://code.google.com/p/giffiledecoder- 디코더는 Java로 구현되므로 작업하기가 더 쉽습니다. 대용량 파일에서도 여전히 효율적입니다.

또한 GifDecoder 클래스를 기반으로하는 많은 라이브러리를 찾을 수 있습니다. Java 기반 디코더이기도하지만 전체 파일을 메모리에로드하여 작동하므로 작은 파일에만 적용 할 수 있습니다.


답변

안드로이드에서 애니메이션 GIF를 사용하는 것은 정말 힘들었습니다. 나는 두 가지 일만했다.

  1. WebView
  2. 이온

WebView는 정상적으로 작동하지만 실제로는 뷰로드 속도가 느려지고 앱이 1 초 동안 응답하지 않습니다. 나는 그것을 좋아하지 않았다. 그래서 다른 접근법을 시도했습니다 (작동하지 않았습니다).

  1. ImageViewEx 는 더 이상 사용되지 않습니다!
  2. 피카소 는 애니메이션 GIF를로드하지 않았다
  3. android-gif-drawable 은 훌륭하게 보이지만 프로젝트에서 유선 NDK 문제가 발생했습니다. 로컬 NDK 라이브러리가 작동을 멈추고 고칠 수 없었습니다.

나는 몇 가지를주고 받았다 Ion. 마지막으로, 나는 작동하고 있으며, 정말 빠릅니다 🙂

Ion.with(imgView)
  .error(R.drawable.default_image)
  .animateGif(AnimateGifMode.ANIMATE)
  .load("file:///android_asset/animated.gif");