Glide 分享转换后的 GIF

Glide sharing transformed GIF

我想分享我用 Glide 加载的 GIF,但找不到方法。

我尝试将 GifDrawable 数据作为字节数组共享,但是当我尝试共享时,GIF 没有出现。

这是我写的代码:

Glide.with(getActivity())
        .load(to_add.mMeme.getmUrl())
        .asGif()
        .diskCacheStrategy(DiskCacheStrategy.ALL)
        .transformFrame(new TextTransformation(getContext(), to_add.mMeme.getmText()))
        .listener(new RequestListener<String, GifDrawable>() {
            @Override
            public boolean onException(Exception e, String s, Target<GifDrawable> target, boolean b) {
                return false;
            }

            @Override
            public boolean onResourceReady(GifDrawable gifDrawable, String s, Target<GifDrawable> target, boolean b, boolean b1) {
                to_add.mDrawable = gifDrawable;
                to_add.mView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Meme to_share = null;
                        for (Meme meme : mViewList) {
                            if (meme.mView.equals(v)) {
                                to_share = meme;
                                break;
                            }
                        }
                        if (to_share != null) {
                            Intent shareIntent = new Intent();
                            shareIntent.setAction(Intent.ACTION_SEND);
                            shareIntent.setType("image/*");
                            shareIntent.putExtra(Intent.EXTRA_STREAM, to_share.mDrawable.toString());
                            startActivity(Intent.createChooser(shareIntent, "Share"));
                        }
                    }
                });
                return false;
            }
        })
        .into((ImageView) to_add.mView.findViewById(R.id.memeImageView));

这是我在之前的代码中使用的 Meme class:

public static class Meme {
    public Meme(StorageManager.Meme meme, View view) {
        mMeme = meme;
        mView = view;
    }

    StorageManager.Meme mMeme;
    View mView;
    GifDrawable mDrawable;
}

mViewList 是模因列表:

List<Meme> mViewList;

to_add 变量是包含我要分享的 GIF 的 Meme :

final Meme to_add = new Meme(data, getActivity().getLayoutInflater().inflate(R.layout.meme_layout, null));

我想念如何使用共享意图。

有意分享

为了回答我的问题,使用共享意图共享文件要求该文件可以在驱动器上访问。 这就是为什么我必须使用 :

将它写入高速缓存
File file = new File(mContext.getExternalCacheDir(), myMeme.getmFileName());
file.setReadable(true);

不要把你的文件写在你的应用程序缓存目录中,否则其他应用程序将无法访问该文件

mContext.getCacheDir()

然后我可以使用 Uris 轻松共享我的文件:

Uri uri = Uri.fromFile(file);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("image/gif");
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(shareIntent, "Share with"));

现在共享功能完美无缺。

关于 Glide GIF

我无法获得 Glide 转换的 GIF。 为了将我的文字添加到 GIF,我拆分了构成 GIF 的所有帧并写下了文字。

使用 Glide 将 GIF 分割成帧

GifDecoder decoder = mGif.getmDrawable().getDecoder();
Bitmap frame;

Log.d("GIF GENERATION", "STARTED FRAME SPLIT");
int max = mGif.getmDrawable().getFrameCount();
int current = 0;
decoder.advance();
while (current < max && (frame = decoder.getNextFrame()) != null) {
    Log.d("GIF GENERATION", "ADDED FRAME");
    // Here you get your GIF frame per frame
    decoder.advance();
    current++;
}
Log.d("GIF GENERATION", "ENDED FRAME SPLIT");

向每一帧添加文本

为了在每一帧上写下我的文本,我使用了这个 class 非常适合单行文本:http://www.skoumal.net/en/android-how-draw-text-bitmap/

正在创建带框架的新 GIF

为此,我使用了另一个名为 GifCreator 的 class。可以在这里找到:https://github.com/nbadal/android-gif-encoder

最终结果

实际代码如下:

GifDecoder decoder = mGif.getmDrawable().getDecoder();
GifCreator creator = new GifCreator();
Bitmap frame;

creator.start(mOs);
creator.setSize(mGif.getmDrawable().getDecoder().getWidth(), mGif.getmDrawable().getDecoder().getHeight());
creator.setRepeat(0);
creator.setQuality(15);

Log.d("GIF GENERATION", "STARTED FRAME SPLIT");
int max = mGif.getmDrawable().getFrameCount();
int current = 0;
decoder.advance();

while (current < max && (frame = decoder.getNextFrame()) != null) {
    Log.d("GIF GENERATION", "ADDED FRAME");
    creator.addFrame(TextTransformation.drawTextToBitmap(mContext, temp, mText));
    creator.setDelay(decoder.getNextDelay());
    decoder.advance();
    current++;
}
Log.d("GIF GENERATION", "ENDED FRAME SPLIT");

creator.finish();