2012-03-21 8 views
0

私はAndroidで簡単な描画アプリを作っています。 ApiDemosサンプルで提供されているFingerPaint.javaをベースに使用しています。いくつかの機能を追加し、他のものを取り除いています。基本的には上に描画できるビットマップを持つキャンバスを作成します。Android 2.3でビットマップを編集する

「公開」と「保存」機能を追加しました。 「保存」機能は、getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)関数を使用してビットマップをファイルに格納し、「オープン」機能はstartActivityForResult(photoPickerIntent、1)を起動し、選択したイメージをロードします。

問題は、手動で開いたビットマップを描画できないことです。指で描くとトレースが表示されますが、指が画面から持ち上がるとトレースが消えます。このビットマップを保存すると、ギャラリーに完全に変更されずに表示されます。しかし、アプリケーションを起動するときに、私はキャンバス上でうまく描画することができます。

これは、キャンバスとビットマップがどのように動作するかを理解していないため、非常に単純な問題であると確信しています。とにかく、ここに私のコードです。

私のカスタムビューの作成:

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); 

私はまだこれが必要な理由はかなりよく分からないが、私はそれがこの行せずに動作しないことを知っています。

2番目のことは、読み込んでいたビットマップをコピーすることでした。 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

ありがとうございますが、それで解決しません。問題は、開いている関数を使ってビットマップを読み込むと、ビットマップが画面に表示されますが、その上に描画するものは、画面から指を離す瞬間に消えてしまうことです。私が保存をクリックすると、ビットマップは変更されずに保存されるので、画像を保存する方法には問題はないが、新しいビットマップをロードする方法は間違いないと私は確信している。 – ziritrion