我正在构建一个使用Android的Canvas和Drawables的应用程序。
保存图纸以供日后修改的最佳方法是什么?假设它有我希望用户能够保存的线条和图标,并且仍然可以在以后修改图形的每个组件。
我知道我可以将图形保存为.png或.jpg,但之后无法编辑。我找到了一种将SVG文件呈现给Canvas的方法,但不是相反。
答案 0 :(得分:1)
您需要保存绘制的基元列表,因为画布只使用了Bitmap。此外,您必须存储z-index,以确定它们出现的顺序,以便允许用户重新排序元素。
实际上可能更容易定义一个新的EditableShape类,它保存控件(即椭圆的直线,中心和两个轴的端点),可以写入文件。
对于图像,您可能必须存储附加了唯一ID的图像副本,而不仅仅是地址,以防原件被删除。
答案 1 :(得分:1)
如果你想保存它,也可以在保存之后再编辑并重新打开它,那么我们将不得不检查它。
但是如果你只想保存绘图你的绘图和画布,那么试试这个:
@Override
public void onClick(View v) {
final Activity currentActivity = YourActivity.this;
Handler saveHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
final AlertDialog alertDialog = new AlertDialog.Builder(currentActivity).create();
alertDialog.setTitle("Your Title");
alertDialog.setMessage("Your drawing is saved to Gallery.");
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
return;
}
});
alertDialog.show();
}
} ;
new ExportBitmapToFileToSaveInGallery(TWSBIDrawMainActivity.this,saveHandler, bm).execute();
// to Saw progressBar and also the dialog box that gives confirmation to user.
public static class ExportBitmapToFileToSaveInGallery extends AsyncTask<Intent,Void,Boolean> {
private Context mContext;
private Handler mHandler;
private Bitmap nBitmap;
private ProgressDialog m_progressDialog = null;
@Override
protected void onPreExecute(){
m_progressDialog = new ProgressDialog(mContext);
m_progressDialog.setTitle("Draw");
m_progressDialog.setMessage("Please wait...");
m_progressDialog.setCancelable(false);
m_progressDialog.show();
}
public ExportBitmapToFileToSaveInGallery(Context context,Handler handler,Bitmap bitmap) {
mContext = context;
nBitmap = bitmap;
mHandler = handler;
}
@Override
protected Boolean doInBackground(Intent... arg0) {
try {
if (!APP_FILE_PATH.exists()) {
APP_FILE_PATH.mkdirs();
}
final FileOutputStream out = new FileOutputStream(new File(APP_FILE_PATH + "/"+timeStampFormat.format(new Date())+".jpg"));
nBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
return true;
}catch (Exception e) {
e.printStackTrace();
}
//mHandler.post(completeRunnable);
return false;
}
@Override
protected void onPostExecute(Boolean bool) {
super.onPostExecute(bool);
if ( bool ){
mHandler.sendEmptyMessage(1);
}
if (m_progressDialog.isShowing()) {
m_progressDialog.dismiss();
}
}
}
这会将您的画布图存储到您想要的格式,一旦保存,您还可以根据需要添加一些图形。 希望它对你有所帮助。
感谢。
答案 2 :(得分:0)
你必须以某种方式存储你在画布上调用的每个动作,因为我知道在将它们应用到画布后我无法检索它们。
也许通过扩展Canvas类,并覆盖每个函数将操作存储在文件或数据库中,然后运行超类的方法?