我正在寻找一种在原生 Android 应用程序中创建动画 GIF 的简单方法。源文件应该是 JPEG(来自相机或其他),输出应该在设备上保存为 GIF。
我不想知道如何播放动画或动画 GIF 文件。
要清楚:我想知道如何将单个图像逐帧放入“电影”中,然后将其保存为 .gif 文件。
例如,这个应用程序可以做我想做的事情。
请参阅此解决方案。
https://github.com/nbadal/android-gif-encoder
这是这篇文章的安卓版本。
http://www.jappit.com/blog/2008/12/04/j2me-animated-gif-encoder/
要使用这个类,这里有一个生成 GIF 字节数组的示例帮助方法。请注意,getBitmapArray() 函数是一种一次性返回图像适配器中所有位图文件的方法。所以输入是一个适配器中的所有位图文件,输出是一个字节数组,您可以将其写入文件。
public byte[] generateGIF() {
ArrayList<Bitmap> bitmaps = adapter.getBitmapArray();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
AnimatedGifEncoder encoder = new AnimatedGifEncoder();
encoder.start(bos);
for (Bitmap bitmap : bitmaps) {
encoder.addFrame(bitmap);
}
encoder.finish();
return bos.toByteArray();
}
要使用此功能,请执行以下操作,然后您可以将文件保存到 SD 卡中。
FileOutputStream outStream = null;
try{
outStream = new FileOutputStream("/sdcard/generate_gif/test.gif");
outStream.write(generateGIF());
outStream.close();
}catch(Exception e){
e.printStackTrace();
}
这可能会帮助你。这是一个用于生成 gif 文件的类。
它对我来说做得很好,它可以快速创建文件并提供高质量的图像
//True for dither. Will need more memory and CPU
AnimatedGIFWriter writer = new AnimatedGIFWriter(true);
OutputStream os = new FileOutputStream("animated.gif");
Bitmap bitmap; // Grab the Bitmap whatever way you can
// Use -1 for both logical screen width and height to use the first frame dimension
writer.prepareForWrite(os, -1, -1)
writer.writeFrame(os, bitmap);
// Keep adding frame here
writer.finishWrite(os);
// And you are done!!!
如果您只想像动画 gif 一样显示这些位图,可以使用以下代码创建AnimatedDrawable :
AnimationDrawable animation = new AnimationDrawable();
animation.addFrame(getResources().getDrawable(R.drawable.image1), 10);
animation.addFrame(getResources().getDrawable(R.drawable.image2), 50);
animation.addFrame(getResources().getDrawable(R.drawable.image3), 30);
animation.setOneShot(false);
ImageView imageAnim = (ImageView) findViewById(R.id.imageView);
imageAnim.setImageDrawable(animation);
// start the animation!
animation.start();
解决方案 1
你看过这篇文章吗?.....它带有源代码..
据我所知,我认为 android 不会播放 gif 动画图像。您应该使用将播放 gif 动画的 webview..
http://droid-blog.net/2011/10/14/tutorial-how-to-use-animated-gifs-in-android-part-1/
如果可以的话..
http://androidosbeginning.blogspot.in/2010/09/gif-animation-in-android.html
解决方案 2
Android 提供Drawable Animation。
Gif 基本上是一组具有恒定帧时间延迟的图像。你不能直接在android中播放gif。我在 android 中播放 gif 动画方面做了很多工作。
在播放 gif 时,我们也自己处理所有播放帧的调用。所以这不是最好的方法
如果您有一组图像,只需按帧延迟播放它们。这就是你想要的。
您也不能通过本机代码在应用程序中制作 gif。使用 gif 格式也有一些缺点。这是我在比赛中遇到的。
如果您有一组可绘制对象,您也可以使用 AnimationDrawable来显示类似 gif 的动画。它还可以设置任何视图。
我还制作了一个自定义视图来播放 gif 动画。首先,我加载 gif 并将其转换为 InputStream,然后将其传递给我的自定义视图类以播放 gif。
public class GifWebView extends View {
private Movie mMovie;
InputStream mStream;
long mMoviestart;
private boolean play;
public GifWebView(Context context, InputStream stream) {
super(context);
mStream = stream;
setPlay(true);
mMovie = Movie.decodeStream(mStream);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT);
super.onDraw(canvas);
final long now = SystemClock.uptimeMillis();
if (mMoviestart == 0) {
mMoviestart = now;
}
final int relTime = (int) ((now - mMoviestart) % mMovie.duration());
mMovie.setTime(relTime);
mMovie.draw(canvas, 20, 20);
if (play) {
Log.i("reltime", "" + relTime + ",duration:" + mMovie.duration());
this.invalidate();
}
}
@Override
public boolean onTouchEvent(android.view.MotionEvent event) {
return true;
};
public boolean isPlay() {
return play;
}