用图书馆显示Gif图像

时间:2015-10-07 15:51:45

标签: android gif animated-gif

我正在使用此库来显示gif图像:documentation

但我不知道如何在这些代码中实现我的gif图像。我在资产文件夹中有一些GifImages。

这是我的代码:

PlayActivity.java:

import android.app.Activity;
import android.os.Bundle;

import com.felipecsl.gifimageview.library.GifImageView;

import java.io.IOException;
import java.io.InputStream;

public class PlayActivity extends Activity{

    GifImageView gifView;
    //byte[] bytes;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_play_activity);

        try {
            InputStream is = getAssets().open("rain_4.gif");
            byte[] bytes = new byte[is.available()];
            is.read(bytes);
            is.close();

            gifView = (GifImageView) findViewById(R.id.gifImageView);
            gifView = new GifImageView(this);
            gifView.setBytes(bytes);
            gifView.startAnimation();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        if(gifView != null) gifView.startAnimation();
    }

    @Override
    protected void onStop() {
        super.onStop();
        if(gifView != null) gifView.startAnimation();
    }
}

和layout_play_activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".PlayActivity">

    <com.felipecsl.gifimageview.library.GifImageView
        android:id="@+id/gifImageView"
        android:layout_gravity="center"
        android:scaleType="fitCenter"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

4 个答案:

答案 0 :(得分:2)

1.我建议您查看图像管理库(Facebook) Fresco,与其他图像加载库相比,它非常棒且成熟。

2.Fresco拥有SimpleDraweeView作为自定义图片视图,支持Rounded Corners and Circles link支持动画(.gif,.webp)以及普通图片(.jpg, .PNG)。

3.Fresco使用3层架构处理所有图像缓存(BITMAP_MEMORY_CACHEENCODED_MEMORY_CACHEDISK_CACHE)。它还减少了OOM(Out Of Memory)问题。当视图中的图像离开屏幕时,它会自动回收位图,从而释放内存。

答案 1 :(得分:1)

您提供的图书馆链接中有一个示例。加载GifImageView的方式与示例中的方式不同。样本从互联网上下载了一个gif。

以下是样本的MainActivity的摘录:

GifImageView gifImageView = (GifImageView) findViewById(R.id.gifImageView);

new GifDataDownloader() {
    @Override
    protected void onPostExecute(final byte[] bytes) {
        gifImageView.setBytes(bytes);
        gifImageView.startAnimation();
        Log.d(TAG, "GIF width is " + gifImageView.getGifWidth());
        Log.d(TAG, "GIF height is " + gifImageView.getGifHeight());
    }
}.execute("http://gifs.joelglovier.com/aha/aha.gif");

解决方案:

我不确定您是否可以使用此库从资产加载GifImageView,但我更喜欢使用离子库。这真的很好很简单。使用该库,您还可以根据需要拉伸gif图像:

https://github.com/koush/ion

简单示例:

ImageView imageView = (ImageView) findViewById(R.id.imageView);
Ion.with(imageView).load("http://gifs.joelglovier.com/aha/aha.gif");

答案 2 :(得分:0)

首先,您需要将gif放在assets文件夹中。默认情况下,在Android Studio项目中不会创建assets文件夹,因此您应该在src/main/assets中创建一个目录并将.gif文件放入其中。 应该为drawables保留drawable resources文件夹。

您可以使用输入流将字节加载到字节数组中,这可以在onCreate方法中完成:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_play_activity);
    try {
        //animation.gif is just an example, use the name of your file
        //that is inside the assets folder.

        InputStream is = getAssets().open("animation.gif");
        bytes = new byte[is.available()];
        is.read(bytes);
        is.close();

        gifView = (GifImageView) findViewById(R.id.gifImageView);
        gifView = new GifImageView(this);
        gifView.setBytes(bytes);
        gifView.startAnimation();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

答案 3 :(得分:0)

我建议调查Glide library,因为它会动画GIF而不做任何修改,并且可以适用于任何项目。

如果您在任何类型的回收视图中使用这些图像,它还具有更平滑的加载和适当的大小调整的附加好处。

正如@fixmycode所说,如果你想使用当前的实现,你永远不会定义bytes []。