使用Parcelable将绘图保存到磁盘

4

我正在使用这段代码保存和恢复我的自定义手绘视图,如何使用这段代码将我的图纸以矢量格式而不是位图格式保存到SD卡上的文件中,并在下一个应用程序会话中重新加载它:

@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();
}

FreeDrawSavedState 是否实现了 Parcelable 接口? - Hugo Gresse
你的手绘视图是一个 .xml 文件吗?由于在 VectorDrawable 中没有直接访问内部元素的方法,所以你需要保存它的哪个状态呢? - leobelizquierdo
4个回答

5

您需要创建自己的文件格式来存储自定义矢量图。将所有点及其属性保存到JSON文件中是一种可能的解决方案。

Android的Parcelable不适用于持久存储,只适用于应用程序或进程间通信。因为二进制格式可能会因为新的二进制格式需要更小的内存或处理器占用而在Android更新时发生变化。因此,在此类更新后进行加载将导致数据丢失。


3
我在我的一个应用程序中做了这件事。我使用自由手绘制图形创建形状。我使用的元素包括Group,Layer,Path,Point,Shape及其属性。我从PathLayer中创建了json数组,并使用它们的一些属性,如strokeWidth,dashEffect,color等。将所有这些以json格式存储在表格中。在一个设备上运行得很好,但是一旦将json发送到服务器并在其他移动设备上绘制相同的内容,绘画的形状就会变小或变大。这是因为我没有考虑到设备分辨率或密度因素。在发送到服务器之前,我计算或获取了第一次绘制图像时Path中使用的pointdensity因素。然后我将这个density因素发送到服务器。每当我在其他移动设备上画这个图形时,我都会使用这个density因素进行绘图计算。
我不建议使用Parcelable,因为它用于组件之间的通信。
引用块如下:
那种额外的效率也有其限制:使用Parcelable传递图像(Bitmap)通常不是一个好主意(尽管Bitmap实际上实现了Parcelable)。一个更节省内存的方法是只传递它的URI或资源ID,以便您的应用程序中的其他Android组件可以访问它。
Parcelable的另一个限制是,它不应用于通用序列化到存储器,因为底层实现可能随着不同版本的Android OS而变化。所以,是的,Parcels在设计上更快,但作为高性能传输,而不是通用序列化机制的替代品。
以上引用块来自:不应用于通用序列化到存储

1
根据我的理解,您希望将自定义绘图图像保存为svg/矢量文件格式。为此,请尝试在GitHub上提供的此库。 compile 'com.github.gcacace:signature-pad:1.2.1' 使用此库,您可以将位图保存为svg文件并将其解析为Parcelable字符串。

-1

我认为你应该在位图上绘制所有的图案,然后在onSaveInstanceState()方法中将位图保存到SD卡上。你可以在这里找到保存位图的代码

Android saving Bitmap to SD card

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


请问您的Telegram账号是什么? - Shafizadeh
抱歉,我通常都在这里。你可以在这里问问题 :) - zohreh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接