2012-03-21 75 views
0

我正在Android上製作一個簡單的繪圖應用程序。我使用ApiDemos示例提供的FingerPaint.java作爲基礎,添加了一些功能並刪除了其他功能。它基本上創建一個帶有位圖的畫布,可以在上面繪製。在Android 2.3中編輯位圖

我添加了「打開」和「保存」功能。 「保存」功能使用getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)函數將位圖存儲到文件中,「打開」功能啓動startActivityForResult(photoPickerIntent,1)並加載所選圖像。

問題是我無法在手動打開的位圖上繪製。用手指畫出時會顯示一條曲線,但是一旦手指從屏幕上擡起,曲線就會消失。如果我保存該位圖,它將在畫廊中完全未修改。但是當啓動應用程序時,我可以在畫布上畫得很好。

我敢肯定,這是一個非常簡單的問題,因爲我不瞭解Canvas和Bitmap的工作原理。無論如何,這是我的代碼。

在創建自定義查看:

public MyView(Context c){ 

     super(c); 

     mBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

    } 

的OnDraw的覆蓋:

@Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(0xFFAAAAAA); 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, mPaint); 
    } 

我的 「開放式」 的功能:

private void open(){ 
    //checkSD: 1 if read only, 2 if RW 
    if(checkSD()==1 || checkSD()==2){ 
     Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
     photoPickerIntent.setType("image/*"); 
     startActivityForResult(photoPickerIntent, 1); 
    } 
} 

最後我onActivityResult:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    //RequestCode:1 image 
    if (requestCode == 1) { 
     if (resultCode == Activity.RESULT_OK) { 
      Uri selectedImage = data.getData(); 
      try{ 
       InputStream fIn = getContentResolver().openInputStream(selectedImage); 
       mBitmap = BitmapFactory.decodeStream(fIn); 
       fIn.close(); 
      } catch (Exception e){ 
       e.printStackTrace(); 
      } 

     } 
    } 
} 

我想我的錯誤是在這段代碼中,但如果有人認爲它可能是我實際繪製的方式,我沒有修改FingerPaint.java示例中的touch_xxx和onTouchEvent,所以您可以看看它(或者讓我在這裏發佈,如果你由於某種原因無法看到它)。

謝謝!

回答

1

好的,解決了!

我做了2件事。第一個是在「fIn.close();」之後添加以下行:在onActivityResult:

mCanvas = new Canvas(mBitmap); 

我還不太清楚爲什麼這是必要的,但我知道它不工作沒有這條線。

我做的第二件事是複製我加載的位圖。原來,BitmapFactory.decodeStream()返回一個不可變的位圖,爲了創建一個新的畫布,需要一個可變的位圖。我發現這個博客帖子一個很好的解釋:

http://sudarnimalan.blogspot.com.es/2011/09/android-convert-immutable-bitmap-into.html

我用第二種方法,它是複製位圖到一個新的,就像這樣:

mBitmap = mBitmap.copy(Config.ARGB_8888, true); 

我從帖子知道這不是一個安全的方法,但現在它的工作。

如果只有我在我的搜索中使用了「無形的位圖」,我會自己想出一個答案。無論如何謝謝你!

0

另一種從視圖中保存圖像的方法是在視圖上啓用圖形緩存,當用戶單擊保存時使用getDrawingCache()獲取位圖並保存它。

+0

謝謝,但這並不完全解決它。問題是,當我使用open函數加載位圖時,位圖顯示在屏幕上,但是在我從屏幕上擡起手指的那一刻,我在它上面繪製的任何東西都會消失。如果我點擊保存位圖存儲沒有任何修改,所以我相當確定這是不是我存儲圖像的方式的問題,但與我加載一個新的位圖的方式。 – ziritrion 2012-03-21 22:46:33