1 package jp.sourceforge.gokigen.memoma;
4 import java.io.FileOutputStream;
5 import java.io.OutputStream;
6 import java.text.SimpleDateFormat;
7 import java.util.Calendar;
8 import java.util.Enumeration;
10 import android.app.Activity;
11 import android.app.ProgressDialog;
12 import android.graphics.Bitmap;
13 import android.graphics.Bitmap.CompressFormat;
14 import android.graphics.Canvas;
15 import android.graphics.Rect;
16 import android.os.AsyncTask;
17 import android.util.Log;
18 import android.view.Display;
21 * データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
22 * Viewの情報を画像形式(png形式)で保存する。
23 * どのViewを保存するのかは、ICaptureExporter.getCaptureTargetView()クラスを使って教えてもらう。
26 * String : 実行時に渡すクラス(Param) : ファイル名をもらう
27 * Integer : 途中経過を伝えるクラス(Progress) : 今回は使っていない
28 * String : 処理結果を伝えるクラス(Result) : 結果を応答する。
33 public class ObjectLayoutCaptureExporter extends AsyncTask<String, Integer, String>
35 private static final int OUTPUT_MARGIN = 8;
36 private static final int OUTPUT_MARGIN_TOP = 50;
38 private static final int MINIMUM_WIDTH = 800;
39 private static final int MINIMUM_HEIGHT = 600;
41 private Activity parent = null;
42 private ICaptureLayoutExporter receiver = null;
43 private ExternalStorageFileUtility fileUtility = null;
44 private String exportedFileName = null;
45 private MeMoMaObjectHolder objectHolder = null;
46 private MeMoMaCanvasDrawer canvasDrawer = null;
47 private ProgressDialog savingDialog = null;
48 private float offsetX = 0.0f;
49 private float offsetY = 0.0f;
54 public ObjectLayoutCaptureExporter(Activity context, ExternalStorageFileUtility utility, MeMoMaObjectHolder holder, MeMoMaCanvasDrawer drawer, ICaptureLayoutExporter resultReceiver)
56 receiver = resultReceiver;
57 fileUtility = utility;
58 objectHolder = holder;
59 canvasDrawer = drawer;
62 // プログレスダイアログ(「保存中...」)を表示する。
63 savingDialog = new ProgressDialog(context);
64 savingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
65 savingDialog.setMessage(context.getString(R.string.dataSaving));
66 savingDialog.setIndeterminate(true);
67 savingDialog.setCancelable(false);
70 /** ファイルをバックアップするディレクトリを作成する **/
71 File dir = new File(fileUtility.getGokigenDirectory() + "/exported");
80 protected void onPreExecute()
86 * ビットマップデータを(PNG形式で)保管する。
92 private String exportToFile(String fileName, Bitmap targetBitmap)
94 String resultMessage = "";
97 if (targetBitmap == null)
99 // ビットマップが取れないため、ここで折り返す。
100 return ("SCREEN DATA GET FAILURE...");
103 // エクスポートするファイル名を決定する
104 Calendar calendar = Calendar.getInstance();
105 SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
106 exportedFileName = fileName + "_" + outFormat.format(calendar.getTime()) + ".png";
109 OutputStream out = new FileOutputStream(exportedFileName);
110 targetBitmap.compress(CompressFormat.PNG, 100, out);
116 resultMessage = " ERR(png)>" + e.toString();
117 Log.v(Main.APP_IDENTIFIER, resultMessage);
120 return (resultMessage);
124 * キャンバスの大きさがどれくらい必要か、チェックする。
128 private Rect checkCanvasSize()
130 Rect canvasSize = new Rect();
133 Enumeration<Integer> keys = objectHolder.getObjectKeys();
134 while (keys.hasMoreElements())
136 Integer key = keys.nextElement();
137 MeMoMaObjectHolder.PositionObject pos = objectHolder.getPosition(key);
138 if (canvasSize.left > pos.rect.left)
140 canvasSize.left = (int) pos.rect.left;
142 if (canvasSize.right < pos.rect.right)
144 canvasSize.right = (int) pos.rect.right;
146 if (canvasSize.top > pos.rect.top)
148 canvasSize.top = (int) pos.rect.top;
150 if (canvasSize.bottom < pos.rect.bottom)
152 canvasSize.bottom = (int) pos.rect.bottom;
157 canvasSize.left = canvasSize.left - OUTPUT_MARGIN;
158 canvasSize.right = canvasSize.right + OUTPUT_MARGIN;
159 canvasSize.top = canvasSize.top - OUTPUT_MARGIN_TOP;
160 canvasSize.bottom = canvasSize.bottom + OUTPUT_MARGIN;
164 Display display = parent.getWindowManager().getDefaultDisplay();
165 int width = display.getWidth();
166 int height = display.getHeight();
167 if (width < MINIMUM_WIDTH)
169 width = MINIMUM_WIDTH;
171 if (height < MINIMUM_HEIGHT)
173 height = MINIMUM_HEIGHT;
176 // 出力の最小サイズを(表示画面サイズに)設定
177 if (canvasSize.width() < width)
179 canvasSize.right = canvasSize.left + width;
181 if (canvasSize.height() < height)
183 canvasSize.bottom = canvasSize.top + height;
187 // 画像位置(キャンバス位置)の調整。。。
188 offsetX = 0.0f - canvasSize.left - (OUTPUT_MARGIN);
189 offsetY = 0.0f - canvasSize.top - (OUTPUT_MARGIN);
191 // 出力する画像データのサイズを表示する
192 Log.v(Main.APP_IDENTIFIER, "ObjectLayoutCaptureExporter::checkCanvasSize() w:" + canvasSize.width() + " , h:" + canvasSize.height() + " offset :(" + offsetX + "," + offsetY + ")");
198 * (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
202 protected String doInBackground(String... datas)
204 Rect canvasSize = checkCanvasSize();
205 Bitmap targetBitmap = Bitmap.createBitmap(canvasSize.width(), canvasSize.height(), Bitmap.Config.RGB_565);
206 Canvas targetCanvas = new Canvas(targetBitmap);
208 // オブジェクトをビットマップの中に書き込む
209 canvasDrawer.drawOnBitmapCanvas(targetCanvas, offsetX, offsetY);
211 // ファイル名の設定 ... (拡張子なし)
212 String fileName = fileUtility.getGokigenDirectory() + "/exported/" + datas[0];
215 String result = exportToFile(fileName, targetBitmap);
227 protected void onProgressUpdate(Integer... values)
237 protected void onPostExecute(String result)
241 if (receiver != null)
243 receiver.onCaptureLayoutExportedResult(exportedFileName, result);
248 Log.v(Main.APP_IDENTIFIER, "ViewCaptureExporter::onPostExecute() : " + ex.toString());
251 if (savingDialog != null)
253 savingDialog.dismiss();
264 public interface ICaptureLayoutExporter
267 public abstract void onCaptureLayoutExportedResult(String exportedFileName, String detail);