2012-03-21 77 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