Display Animated GIF

后端 未结 30 2029
无人及你
无人及你 2020-11-22 02:11

I want to display animated GIF images in my aplication. As I found out the hard way Android doesn\'t support animated GIF natively.

However it can display animations

相关标签:
30条回答
  • 2020-11-22 02:42

    Just wanted to add that the Movie class is now deprecated.

    This class was deprecated in API level P.

    It is recommended to use this

    AnimatedImageDrawable

    Drawable for drawing animated images (like GIF).

    0 讨论(0)
  • 2020-11-22 02:44

    Nobody has mentioned the Ion or Glide library. they work very well.

    It's easier to handle compared to a WebView.

    0 讨论(0)
  • 2020-11-22 02:46

    Try this, bellow code display gif file in progressbar

    loading_activity.xml(in Layout folder)

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff" >
    
        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:indeterminate="true"
            android:indeterminateDrawable="@drawable/custom_loading"
            android:visibility="gone" />
    
    </RelativeLayout>
    

    custom_loading.xml(in drawable folder)

    here i put black_gif.gif(in drawable folder), you can put your own gif here

    <?xml version="1.0" encoding="utf-8"?>
    <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/black_gif"
        android:pivotX="50%"
        android:pivotY="50%" />
    

    LoadingActivity.java(in res folder)

    public class LoadingActivity extends Activity {
    
        ProgressBar bar;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_loading);
            bar = (ProgressBar) findViewById(R.id.progressBar);
            bar.setVisibility(View.VISIBLE);
    
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 02:46

    Some thoughts on the BitmapDecode example... Basically it uses the ancient, but rather featureless Movie class from android.graphics. On recent API versions you need to turn off hardware acceleration, as described here. It was segfaulting for me otherwise.

    <activity
                android:hardwareAccelerated="false"
                android:name="foo.GifActivity"
                android:label="The state of computer animation 2014">
    </activity>
    

    Here is the BitmapDecode example shortened with only the GIF part. You have to make your own Widget (View) and draw it by yourself. Not quite as powerful as an ImageView.

    import android.app.Activity;
    import android.content.Context;
    import android.graphics.*;
    import android.os.*;
    import android.view.View;
    
    public class GifActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new GifView(this));
        }
    
        static class GifView extends View {
            Movie movie;
    
            GifView(Context context) {
                super(context);
                movie = Movie.decodeStream(
                        context.getResources().openRawResource(
                                R.drawable.some_gif));
            }
            @Override
            protected void onDraw(Canvas canvas) {   
                if (movie != null) {
                    movie.setTime(
                        (int) SystemClock.uptimeMillis() % movie.duration());
                    movie.draw(canvas, 0, 0);
                    invalidate();
                }
            }
        }
    }
    

    2 other methods, one with ImageView another with WebView can be found in this fine tutorial. The ImageView method uses the Apache licensed android-gifview from Google Code.

    0 讨论(0)
  • 2020-11-22 02:46

    Something I did for showing gifs in apps. I extended ImageView so people can use its attributes freely. It can show gifs from url or from the assets directory. The library also makes it easy for extending classes to inherit from it and extend it to support different methods to initialize the gif.

    https://github.com/Gavras/GIFView

    There's a little guide on the github page.

    It was also published on Android Arsenal:

    https://android-arsenal.com/details/1/4947

    Use example:

    From XML:

    <com.whygraphics.gifview.gif.GIFView xmlns:gif_view="http://schemas.android.com/apk/res-auto"
            android:id="@+id/main_activity_gif_vie"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:scaleType="center"
            gif_view:gif_src="url:http://pop.h-cdn.co/assets/16/33/480x264/gallery-1471381857-gif-season-2.gif" />
    

    In the activity:

        GIFView mGifView = (GIFView) findViewById(R.id.main_activity_gif_vie);
    
        mGifView.setOnSettingGifListener(new GIFView.OnSettingGifListener() {
                    @Override
                    public void onSuccess(GIFView view, Exception e) {
                        Toast.makeText(MainActivity.this, "onSuccess()", Toast.LENGTH_SHORT).show();
                    }
    
                    @Override
                    public void onFailure(GIFView view, Exception e) {
    
            }
    });
    

    Setting the gif programmatically:

    mGifView.setGifResource("asset:gif1");
    
    0 讨论(0)
  • 2020-11-22 02:48

    I have had success with the solution proposed within this article, a class called GifMovieView, which renders a View which can then be displayed or added to a specific ViewGroup. Check out the other methods presented in parts 2 and 3 of the specified article.

    The only drawback to this method is that the antialiasing on the movie is not that good (must be a side-effect of using the "shady" Android Movie Class). You are then better off setting the background to a solid color within your animated GIF.

    0 讨论(0)
提交回复
热议问题