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();
我想分享我用 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();