【问题标题】:Showing Gif Image with Library显示带有库的 Gif 图像
【发布时间】:2016-01-04 23:01:26
【问题描述】:

我正在使用这个库来显示 gif 图片:https://github.com/felipecsl/GifImageView

但我不知道如何在这些代码中实现我的 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>

【问题讨论】:

    标签: android gif animated-gif


    【解决方案1】:

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

    您可以使用输入流将字节加载到字节数组中,这是在您的 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();
        }
    }
    

    【讨论】:

    • 我已经这样做了(try/catch with those),但它显示错误:java.lang.NullPointerException,此行错误:bytes = new byte[is.available()];
    • 你能发布你的堆栈跟踪吗?
    • 我在手机上,所以我希望你更新你的问题
    • 这在很多层面上都是错误的...... :\ 我会用你可以复制和粘贴的东西来更新我的答案,但在尝试编写 Android 应用程序之前,你真的应该回到你的 Java 基础。给我几分钟
    【解决方案2】:

    我建议查看Glide library,因为它无需任何修改即可制作动画 GIF,并且可以适合任何项目。

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


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

    【讨论】:

      【解决方案3】:

      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(内存不足)问题。当视图中的图像离开屏幕时,它会自动回收位图,从而释放内存。

      【讨论】:

      • 我通常建议不要使用 Fresco,因为它需要对项目进行彻底检查才能正确实施。对于大多数项目,Glide 绰绰有余。
      【解决方案4】:

      您提供的库链接中有一个示例。您加载 GifImageView 的方式与示例中编写的方式不同。该示例正在从 Internet 下载 gif。

      这是来自示例 MainActivity 的 sn-p:

      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,但我更喜欢使用 ion 库。这真的很简单。使用该库,您还可以随意拉伸 gif 图像:

      https://github.com/koush/ion

      简单示例:

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

      【讨论】:

      • 不知道怎么开聊天室,可以开吗?你也试过视频中提到的方法吗?
      • Gif 图片仅在屏幕左上角显示 1/4 大小。
      • 哦,是的,我忘了说如果你使用这个方法你不能改变 gif 的大小,但你仍然可以改变它在屏幕上的位置。但是,也许您需要使用一个名为 ion library 的库。它以显示 gif 图像而闻名。请谷歌一下。 :)
      • 这个库可以帮助 Gif 图片全屏显示吗?
      • Ion 库非常棒。最后,现在一切正常 :),谢谢 :)
      猜你喜欢
      • 1970-01-01
      • 2017-02-13
      • 2022-01-18
      • 2019-06-30
      • 2015-03-30
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多