使用Parcelable将绘图保存到磁盘

时间:2017-02-06 07:39:05

标签: android android-activity instance android-custom-view

我正在使用此代码保存和恢复我的自定义手绘图视图,如何使用此代码将矢量格式(而非位图)的图形保存到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();
}

4 个答案:

答案 0 :(得分:4)

您需要创建自己的文件格式来存储自定义矢量绘图。

将所有积分及其属性保存到JSON文件中是一种可行的解决方案。

Android Parcelable不适用于持久存储,仅适用于应用内或进程间通信。因为二进制格式可以在Android更新之间因任何原因而改变,例如新二进制格式的较小内存或CPU占用空间。因此,在更新之后加载将导致数据丢失。

答案 1 :(得分:3)

我在我的一个申请中这样做了。我用自由手绘图创建了形状。我使用的元素是Group, Layer, Path, Point, Shape及其属性。我已经从PathLayer创建了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

你应该检查你是否已经保存位图,如果是,你应该重新加载它,如果没有你应该绘制它。