2012-03-28 8 views
3

したがって、カスタムビューのonDraw()メソッドでビットマップを描画してアニメーションを作成しています。 onDraw()メソッドによって描画されるビットマップの位置を変更するカスタムビューのメソッドを呼び出す更新スレッドがあります。私がしたいのは、更新スレッドが終了するたびに作成されたビットマップを保存して、保存するビットマップからgifを作成できるようにすることです。onDrawメソッドでアニメーションを行っているカスタムビューからビットマップを保存します。

私はSDカードにメモリに格納されているビットマップをPNGを保存するために以下のコードを発見し、それが保存されたビットマップで動作しますが、私はgetDrawingCache(とのトラブルを抱えている):

これを行う
public void saveView(){ 
    if(counter < 200){ 
     try { 
      counter++; 
      System.out.println("Counter : " + counter); 
      File file = new File(path, "star"+counter+".png"); 
      file.delete(); 
      OutputStream fOut = new FileOutputStream(file); 
      buildDrawingCache(); 
      getDrawingCache().compress(Bitmap.CompressFormat.PNG, 100, fOut); 
      destroyDrawingCache(); 
      fOut.flush(); 
      fOut.close(); 
      MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

今のところ基本的に2つのことをしています:

1)約50枚の画像があり、それをSDカードに保存します。 @約50それはヒープを大きくなる(私はdestroyDrawingCache()は、これは別のスレッドであるため、実際に終了することはできません)

2)撮影した写真では、私は更新されたバッファから取っているので、バッファの更新。

getDrawingCacheがonDraw()を呼び出すように思えるので、onDraw自体のUIスレッドでこれを行うことはできません。

可能な場合はお手数ですが、

+0

'saveViewは、()' UIスレッド上で呼ばれているのですか? –

+0

は、onDrawが呼び出されるたびにそのスレッドに新しいスレッドがありません。 – L7ColWinters

答えて

1

getDrawingCache()をUIスレッドの外から呼び出すべきではありません。そのため、取得するビットマップのスキャンラインが部分的に更新されます。 onDraw()から直接saveView()に電話してください。キャッシュされたビットマップのクローンを作成した後に、ファイル操作だけを別のスレッドで実行することができます。

注:setDrawingCacheEnabled(true)に電話できますか? buildDrawingCache()destroyDrawingCache()に電話する必要はありません。また、デバイスにハードウェアアクセラレーションが有効になっている場合は、setLayerType(LAYER_TYPE_SOFTWARE, null)に電話する必要があります。

もう1つの解決策は、空のビットマップを保持する新しいキャンバスでView.draw(android.graphics.Canvas)を呼び出してビットマップを取得することです。

+0

UIスレッドからコードを実行すると、同じイメージが何度も何度も繰り返されるため、決して変更されません。それ以外はsetDrawingCacheEnabled(true)を使用します。 – L7ColWinters

+0

View.draw(キャンバス)を使用して私がしなければならなかったルートだった。だから基本的に私は更新メソッドからsaveViewを呼び出しました。 saveviewの中で私は一時ビットマップを作成し、作ったビットマップを描画(キャンバス)から手作業で取り出し、リリースしてsdに保存しました。アニメーションでは、私はonDraw()メソッドをオーバーライドしなかったが – L7ColWinters

+0

は私が画面をキャプチャした画像のスイッチャーを拡張し、必要に応じ、それは写真を撮るだが、それは(ちょうどいくつかの時間を点滅)私の見解を描いていないし、全くアニメーションはありません。どのようにイメージをキャプチャすることができますが、それを正しく描くことができないのだろうか?助けてください。 –

関連する問題