アニメーションなどの経過状況をPNGファイルに保存したい時ってありますよね?え、ない?
そんなときのためにビューのスクリーンショットをPNGイメージとして保存するためのクラスを作ってみました。
Runnableインターフェースを実装しているのでHandler#postDelayed()メソッドの引数に指定出来ます。
SavePictureRunner
public class SavePictureRunner implements Runnable {
private File mFileName;
private View mView;
public SavePictureRunner(View view, File filename) {
this.mView = view;
this.mFileName = filename;
}
@Override
public void run() {
FileOutputStream output = null;
try {
output = new FileOutputStream(mFileName);
Bitmap saveBitmap = null;
mView.setDrawingCacheEnabled(true);
mView.setDrawingCacheBackgroundColor(Color.WHITE);
saveBitmap = Bitmap.createBitmap(mView.getDrawingCache());
saveBitmap.compress(CompressFormat.PNG, 100, output);
output.flush();
} catch (IOException e) {
Toast.makeText(mView.getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
e.printStackTrace();
} finally {
mView.setDrawingCacheEnabled(false);
if (output != null) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
んで、こんな風に使います。なお、R.id.frameは、ビューグループ、R.id.animateはframeに内包されるImageViewとします。
使用例
Animation animation;
animation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
animation.setDuration(4000);
File path = new File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"AppName");
if (!path.exists()) {
path.mkdir();
}
View view = findViewById(R.id.frame);
Handler h = new Handler();
for (int i = 0; i < 5; i++) {
h.postDelayed(new SavePictureRunner(view, new File(path, i + ".png")), i * 1000);
}
ImageView animate = (ImageView)findViewById(R.id.animate);
animate.startAnimation(animation);
アニメーションが終わると、次の五つのタイミングで、frameビューのスクリーンショットが/Pictures/AppName/配下に保存されます。
- 0.png:アニメーション開始前の画像
- 1.png:アニメーション開始1秒後の画像
- 2.png:アニメーション開始2秒後の画像
- 3.png:アニメーション開始3秒後の画像
- 4.png:アニメーション終了時の画像(ただし、タイミングによってはアニメーション終了後に画像になることがある)
ちなみに、アニメーションさせる対象となるビューのスクリーンショットを撮ってもアニメーションの様子は分かりませんので注意(アニメーションしていないように見える)