Glide共享改变了GIF

时间:2016-05-20 09:23:58

标签: android sharing animated-gif android-glide android-sharing

我想分享我加载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类:

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

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

mViewList是Meme列表:

List<Meme> mViewList;

to_add变量是包含我正在尝试分享的GIF的Meme:

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

1 个答案:

答案 0 :(得分:2)

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

与意图分享

要回答我的问题,共享具有共享意图的文件需要在驱动器上访问该文件。 这就是为什么我必须使用以下方法将其写入高速缓存:

File file = new File(mContext.getExternalCacheDir(), myMeme.getmFileName());
file.setReadable(true);

不要在App cache dir中写入您的文件,否则其他应用程序将无法访问该文件

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");

向每个框架添加文字

要在每一帧上写下我的文字,我使用的这个课程非常适用于单行文字:http://www.skoumal.net/en/android-how-draw-text-bitmap/

使用框架

创建新的GIF

为此,我使用了另一个名为GifCreator的类。可在此处找到: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();