滑动 - 将GIF保存到文件

时间:2018-06-03 04:41:03

标签: java android kotlin gif android-glide

旁注 - 虽然我的一些例子都在Kotlin中,但Java或Kotlin的答案都很有帮助。

我正在使用Commit Content API创建GIF键盘。为此,我需要能够创建.gif个文件。

我使用Glide从互联网上获取图片并将其显示在recyclerview内的列表中。

对于Glide下载的每张图片,我必须使用该图像的数据创建一个File对象。

我认为有两种方法可以实现这一目标。

1]创建一个覆盖onResourceReady的侦听器。这种方法的问题在于我不知道如何将GifDrawable转换为.gif文件,因为所有Stack Overflow帖子都讨论了如何将Drawable转换为文件:

    Glide.with(context)
            .asGif()
            .load(items[position])
            .listener(object : RequestListener<GifDrawable> {
                override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<GifDrawable>?, isFirstResource: Boolean): Boolean {
                    Log.d("VED-APP","Glide Load Failed")
                    return false
                }

                override fun onResourceReady(resource: GifDrawable?, model: Any?, target: Target<GifDrawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                    //I need code to convert the GifDrawable to a File

                    return false
                }

            })
            .into(holder.imageView)

2]将图像加载到ByteArray或类似的东西。从帖子Glide - download and resize GIF into a file中获取的示例Java代码可能如下所示。这段代码的问题是

A [{1}}已被弃用

B]没有.into(width,height)方法

C]我不想指定GIF的尺寸 - 我只是想使用原始尺寸。 (或者,至少,我想保留纵横比)

.toBytes

有人可以帮助我改进这两种方法中的任何一种,或者建议使用Glide将GIF转换为文件的新方法吗?

2 个答案:

答案 0 :(得分:1)

如果您不必将所有GIF保存在一个特定位置和/或必须命名为gif,我建议您使用Glide自动为您缓存的GIF。

首先,在你的OnBindViewHolder方法中,只需正常加载gif到你的imageview:

var test = React.createClass({
    render: function(){
}
})

并使用此方法将uri送到您想要的任何地方:

<html>

  <head>
    <meta charset="utf-8">
    <title>Articles</title>
    <style>
      .bodyCls {
        float: left;
      }

      .bodyCls article {
        width: 50%;
        float: left;
      }

      article:first-child {
        background-color: red;
      }

      article:nth-child(2) {
        background-color: yellow;
      }

      article:nth-child(3) {
        background-color: blue;
      }

      article:last-child {
        background-color: green;
      }

    </style>
  </head>

  <body class="bodyCls">
    <div>
      <article>First</article>
      <article>Second</article>
      <article>Third</article>
      <article>Fourth</article>
    </div>
  </body>

</html>

答案 1 :(得分:1)

更新@Nhật如果您只需要内容comit API的URI,Tôn的解决方案可能会更好。

我不知道@NhậtTôn的解决方案是否有效。但是,这是我现在使用的解决方案,它基于他们的解决方案。我的解决方案是在Kotlin中,但它可以很容易地转换为Java。

首先,我使用以下代码将图像加载到ImageView

//items[position] is a string that represents a URL
Glide.with(context)
        .load(items[position])
        .into(holder.imageView)

然后我从GifDrawable获取ImageView并将其写入File对象。

val byteBuffer = (holder.imageView.drawable as GifDrawable).buffer
val gifFile = File(localDirectory, "test.gif")

val output = FileOutputStream(gifFile)
val bytes = ByteArray(byteBuffer.capacity())
(byteBuffer.duplicate().clear() as ByteBuffer).get(bytes)
output.write(bytes, 0 ,bytes.size)
output.close()

此解决方案的一个潜在问题是GifDrawable在写入文件时可能会被修改。

修复此问题是在将GifDrawable写入文件之前克隆val newGifDrawable = ((holder.imageView.drawable).constantState.newDrawable().mutate()) as GifDrawable

public function down()
{
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');
    Schema::drop('tableName');
    DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}