我正在寻找一种简单的方法来创建一个原生Android应用程序的GIF动画。 源文件应为JPEG(从相机或什么都)和输出应该在设备上保存为GIF。
我不想知道如何播放动画或GIF动画文件。
需要明确的是:我想知道如何把单个图像帧一帧为“电影”,然后将其保存为.gif文件。
例如, 这个程序可以做到想我想做的事情。
我正在寻找一种简单的方法来创建一个原生Android应用程序的GIF动画。 源文件应为JPEG(从相机或什么都)和输出应该在设备上保存为GIF。
我不想知道如何播放动画或GIF动画文件。
需要明确的是:我想知道如何把单个图像帧一帧为“电影”,然后将其保存为.gif文件。
例如, 这个程序可以做到想我想做的事情。
看到这个解决方案。
https://github.com/nbadal/android-gif-encoder
这是这个职位的Android版本。
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文件的类。
http://elliot.kroo.net/software/java/GifSequenceWriter/
如果你只是想显示这些位图就像一个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();
它确实对我非常好,它创建的文件快速和高质量图像的
//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!!!
https://github.com/dragon66/android-gif-animated-writer
解决方法1
你看过这篇文章? .....它与源代码..
据我所知,我认为Android不会玩GIF动画图像。 您应该使用的WebView,将播放GIF动画..
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提供了可绘制动画 。
GIF基本上是与在帧中的恒定时间延迟的一组图像。 在Android中你不能直接播放GIF。 我玩的GIF动画在android系统的工作很多。
当播放GIF我们也处理的由我们自己打的帧的所有呼叫。 所以,这不是一个最好的方法
如果您已设置的图像只是通过以帧延迟播放。 这将是你想要的一切。
你不能在通过本机代码应用GIF为好。 也有一些缺点,以及使用gif格式。 我曾面临在我的游戏。
如果您已设置可绘制的,你可以使用AnimationDrawable用于显示aanimation如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;
}