保存图纸

时间:2012-01-02 02:55:56

标签: android

我正在构建一个使用Android的Canvas和Drawables的应用程序。

保存图纸以供日后修改的最佳方法是什么?假设它有我希望用户能够保存的线条和图标,并且仍然可以在以后修改图形的每个组件。

我知道我可以将图形保存为.png或.jpg,但之后无法编辑。我找到了一种将SVG文件呈现给Canvas的方法,但不是相反。

3 个答案:

答案 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类,并覆盖每个函数将操作存储在文件或数据库中,然后运行超类的方法?