我正在使用此代码保存和恢复我的自定义手绘图视图,如何使用此代码将矢量格式(而非位图)的图形保存到sdcard上的文件和在下一个应用会话中重新加载:
@Override
protected Parcelable onSaveInstanceState() {
// Get the superclass parcelable state
Parcelable superState = super.onSaveInstanceState();
if (mPoints.size() > 0) {// Currently doing a line, save it's current path
createHistoryPathFromPoints();
}
return new FreeDrawSavedState(superState, mPaths, mCanceledPaths,
mCurrentPaint, mPaintColor, mPaintAlpha, mResizeBehaviour,
mLastDimensionW, mLastDimensionH);
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
// If not instance of my state, let the superclass handle it
if (!(state instanceof FreeDrawSavedState)) {
super.onRestoreInstanceState(state);
return;
}
FreeDrawSavedState savedState = (FreeDrawSavedState) state;
// Superclass restore state
super.onRestoreInstanceState(savedState.getSuperState());
// My state restore
mPaths = savedState.getPaths();
mCanceledPaths = savedState.getCanceledPaths();
mCurrentPaint = savedState.getCurrentPaint();
initFillPaint();
mResizeBehaviour = savedState.getResizeBehaviour();
mPaintColor = savedState.getPaintColor();
mPaintAlpha = savedState.getPaintAlpha();
// Restore the last dimensions, so that in onSizeChanged i can calculate the
// height and width change factor and multiply every point x or y to it, so that if the
// View is resized, it adapt automatically it's points to the new width/height
mLastDimensionW = savedState.getLastDimensionW();
mLastDimensionH = savedState.getLastDimensionH();
notifyRedoUndoCountChanged();
}
答案 0 :(得分:4)
您需要创建自己的文件格式来存储自定义矢量绘图。
将所有积分及其属性保存到JSON文件中是一种可行的解决方案。
Android Parcelable
不适用于持久存储,仅适用于应用内或进程间通信。因为二进制格式可以在Android更新之间因任何原因而改变,例如新二进制格式的较小内存或CPU占用空间。因此,在更新之后加载将导致数据丢失。
答案 1 :(得分:3)
我在我的一个申请中这样做了。我用自由手绘图创建了形状。我使用的元素是Group, Layer, Path, Point, Shape
及其属性。我已经从Path
或Layer
创建了json数组,并创建了一些属性,如strokeWidth, dashEffect, color, etc.
。在表中以json格式存储所有这些。它在一台设备上工作正常,但只要您将json发送到服务器并在其他移动设备上绘制相同的图形,绘图就会被绘制成小型或大型。这是因为我没有考虑设备分辨率或density
因素。在发送到服务器之前,我计算或获取了第一张图像上point
中使用的Path
的密度因子。然后我将此density
因子发送到服务器。每当我在其他手机上绘制此图形时,我都会使用此density
因子进行绘图计算。
我不建议使用Parcelable
,因为它用于组件之间的通信。
额外的效率反过来又限制了:使用Parcelable传递图像(Bitmap)通常不是一个好主意(虽然Bitmap实际上实现了Parcelable)。一种更节省内存的方法是仅传递其URI或资源ID,以便应用程序中的其他Android组件可以访问它。
Parcelable的另一个限制是它不能用于 通用序列化到存储,因为底层 实施可能因Android OS的不同版本而异。所以 是的,包裹在设计上更快,但作为高性能的运输, 不能替代通用序列化机制。
从must not be used for general-purpose serialization to storage
获取上述块引用答案 2 :(得分:1)
据我了解,您希望以svg / vector文件格式保存自定义绘图图像。为此尝试在github上提供此库。 compile 'com.github.gcacace:signature-pad:1.2.1'
通过使用此库,您可以将位图保存到svg文件并在Parcelable中解析为字符串
答案 3 :(得分:-1)
我认为您应该在位图上绘制所有绘图,然后在onSaveInstanceState()
方法中将位图保存在SD卡上。您可以在此处找到用于保存位图的代码
Android saving Bitmap to SD card
你应该检查你是否已经保存位图,如果是,你应该重新加载它,如果没有你应该绘制它。