ネイティブAndroidアプリケーションでアニメーションGIFをcreateする簡単な方法を探しています。ソースファイルはJPEG(カメラなど)であり、出力はデバイスにGIFとして保存する必要があります。
アニメーションやアニメーションGIFファイルの再生方法を知りたくありません。
明確にするために、フレームごとに1つの画像を「ムービー」に入れて、それを.gifファイルとして保存する方法を知りたいです。
例えば このアプリ やりたいことができます。
このソリューションをご覧ください。
https://github.com/nbadal/Android-gif-encoder
Androidこの投稿のバージョンです。
http://www.jappit.com/blog/2008/12/04/j2me-animated-gif-encoder/
このクラスを使用するために、GIFバイト配列を生成するヘルパーメソッドの例を次に示します。ここで注意してください、getBitmapArray()関数は、イメージアダプター内のすべてのビットマップファイルを一度に返すメソッドです。したがって、入力は1つのアダプター内のすべてのビットマップファイルであり、出力はファイルに書き込むことができるバイト配列です。
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();
}
この機能を使用するには、次の手順を実行してから、ファイルをSDcardに保存できます。
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のようにのみ表示する場合は、次のコードを使用してAnimated Drawableを作成できます。
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;
}