1

我创建了一个使用 SPenSdk 库的应用程序,我的应用程序很简单,我所做的是在应用程序开始时canvasView用笔、橡皮擦、撤消和重做选项打开一个。

我有两个按钮,一个将画布保存为 SD 卡中的图像,另一个按钮用于加载保存的图像。

现在我的问题是,每当我加载保存的图像并编辑保存的图像并再次保存图像时,它都会保存为新图像而不是更新保存的图像,为什么会这样?

我把我的代码放在这里。如果可能,请举个例子帮助我解决这个问题。

java文件的代码

public class CanvasActivity extends Activity {
         
private CanvasView  m_CanvasView;
private SettingView m_SettingView;
private Button      m_PenButton, m_EraserButton, m_UndoButton, m_RedoButton, m_SaveButton;      
private int         mButtonTextNormalColor;

public static final String DEFAULT_APP_IMAGEDATA_DIRECTORY = "/mnt/sdcard/SmemoExample";

private File        m_Folder = null;
public static final String SAVED_FILE_EXTENSION = "png";
public static final String EXTRA_IMAGE_PATH = "path";
public static final String EXTRA_IMAGE_NAME = "filename";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    
    m_PenButton     = (Button) findViewById(R.id.pen_button);
    m_PenButton.setOnClickListener(mBtnClickListener);
    mButtonTextNormalColor = m_PenButton.getTextColors().getDefaultColor();
    
    m_EraserButton  = (Button) findViewById(R.id.erase_button);
    m_EraserButton.setOnClickListener(mBtnClickListener);
    
    m_UndoButton    = (Button) findViewById(R.id.undo_button);
    m_UndoButton.setOnClickListener(undoNredoBtnClickListener);
    m_UndoButton.setEnabled(false);
    
    m_RedoButton    = (Button) findViewById(R.id.redo_button);
    m_RedoButton.setOnClickListener(undoNredoBtnClickListener);       
    m_RedoButton.setEnabled(false);
    
    m_SaveButton    = (Button) findViewById(R.id.save_button);
    m_SaveButton.setOnClickListener(mBtnClickListener);
    
    m_CanvasView    = (CanvasView) findViewById(R.id.canvas_view);
    m_SettingView   = (SettingView) findViewById(R.id.setting_view);

    m_CanvasView.setSettingView(m_SettingView);
    m_CanvasView.setOnHistoryChangeListener(historyChangeListener);
    m_CanvasView.setInitializeFinishListener(mInitializeFinishListener);
    
    m_Folder        = new File(DEFAULT_APP_IMAGEDATA_DIRECTORY);
    
    String mFileName = getIntent().getStringExtra(EXTRA_IMAGE_NAME);        
    loadCanvas(mFileName);
}

private OnClickListener undoNredoBtnClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (v == m_UndoButton) {
            m_CanvasView.undo();
        } else if (v == m_RedoButton) {
            m_CanvasView.redo();
        }

        m_UndoButton.setEnabled(m_CanvasView.isUndoable());
        m_RedoButton.setEnabled(m_CanvasView.isRedoable());
    }
};

OnClickListener mBtnClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (v.getId() == m_PenButton.getId()) {
            m_CanvasView.changeModeTo(CanvasView.PEN_MODE);
            m_PenButton.setSelected(true);
            m_PenButton.setTextColor(Color.WHITE);
            m_EraserButton.setSelected(false);
            m_EraserButton.setTextColor(mButtonTextNormalColor);
            
            if (m_PenButton.isSelected()) {
                m_SettingView.showView(AbstractSettingView.PEN_SETTING_VIEW);

            }
        } else if (v.getId() == m_EraserButton.getId()) {
            m_CanvasView.changeModeTo(CanvasView.ERASER_MODE);

            m_EraserButton.setSelected(true);
            m_EraserButton.setTextColor(Color.WHITE);
            m_PenButton.setSelected(false);
            m_PenButton.setTextColor(mButtonTextNormalColor);
            
            if (m_EraserButton.isSelected()) {
                m_SettingView.showView(AbstractSettingView.ERASER_SETTING_VIEW);
            }
        } else if(v.getId() == m_SaveButton.getId()) {
            saveCanvas();
        }
    }
};

public boolean saveCanvas() {
    byte[] buffer = m_CanvasView.getData();

    if (buffer == null)
        return false;
    if (!(m_Folder.exists()))
        m_Folder.mkdirs();
    
    String savePath = m_Folder.getPath() + '/' + UtilitiesActivity.getUniqueFilename(m_Folder, "image", SAVED_FILE_EXTENSION);

    if (UtilitiesActivity.writeBytedata(savePath, buffer))
        return true;
    else
        return false;
}

public boolean loadCanvas(String fileName) {
    String loadPath = m_Folder.getPath() + '/' + fileName;
   
    byte[] buffer = UtilitiesActivity.readBytedata(loadPath);

    if (buffer == null)
        return false;

    m_CanvasView.setData(buffer);

    return true;
}

private CanvasView.OnHistoryChangeListener historyChangeListener = new CanvasView.OnHistoryChangeListener() {
    @Override
    public void onHistoryChanged(boolean bUndoable, boolean bRedoable) {
        m_UndoButton.setEnabled(bUndoable);
        m_RedoButton.setEnabled(bRedoable);
    }
};

CanvasView.InitializeFinishListener mInitializeFinishListener = new CanvasView.InitializeFinishListener() {

    @Override
    public void onFinish() {
        Bitmap bg = BitmapFactory.decodeResource(getResources(), R.drawable.canvas_bg);
        m_CanvasView.setBackgroundImage(bg);
        bg.recycle();
    }
};
}
4

1 回答 1

0

当您保存图像时,它会使用一个新名称并保存它。旧图像不会被覆盖。因此您可以编辑保存画布功能。方法如下图

public boolean saveCanvas()
{
byte[] buffer = mCanvasView.getData();

if(buffer == null)
        return false;

    String savePath = mFolder.getPath() + '/' + ExampleUtils.getUniqueFilename(mFolder, "image", SAVED_FILE_EXTENSION);
    Log.d(TAG, "Save Path = " + savePath);

    if(ExampleUtils.writeBytedata(savePath, buffer))
        return true;
    else 
        return false;       
}

函数“getUniqueFilename”生成一个新名称。因此,如果您更新图像,请避免使用该函数

ExampleUtils.getUniqueFilename(mFolder, "image", SAVED_FILE_EXTENSION);

并用旧名称保存。然后它将被覆盖。

于 2012-05-18T10:39:54.377 回答