2012-05-18 18 views
1

其實我已經創建了一個應用程序,其中我使用了SPenSdk庫,我的應用程序很簡單,我所做的是在應用程序的開始處打開canvasView用筆,橡皮擦,撤消和重做選項。發佈在使用SPenSdk庫的畫布視圖保存模式下的問題

我有兩個按鈕,一個將畫布保存爲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(); 
    } 
}; 
} 

回答

0

當你保存圖像時,它需要一個新的名稱和保存。舊圖像不會被覆蓋。所以你可以編輯保存畫布功能。如果你更新的形象,只是避免了功能

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

,並與舊名稱保存圖所示

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」的方法生成一個新的name.So。然後它會被覆蓋。

+0

這就是我想要的,但如何在它的代碼中執行.... – AndroidDev

+0

當您加載圖像時,臨時保存文件名稱loadCanvas()函數。設置一個顯示畫布加載或新的標誌。在保存時,檢查標誌,如果已加載,則用舊名稱保存圖像。否則生成獨特的名字 –

+0

yeh ..我知道了。謝謝你的回答............... – AndroidDev