2011-12-08 8 views
1

私のアプリでは、ユーザが画像を操作したり、回転したり、ピンチしたりズームしたりします。これはonDraw()using canvas.translate()canvas.rotate()などです。もちろん画像は大きく、ユーザーは他のビューとの対話を実行します。私は大きな画像全体を目に見える部分だけ何度も何度も再描画したくありません。だから私は、ユーザーが操作を完了した後、画面上の現在のVISIBLEイメージをメモリ/ビットマップ/キャッシュに保存し、それを再描画したいと思います。Androidカスタムビュービットマップに可視の画面を保存します

どうすればこの問題を解決できますか?

答えて

1

それを保存します。

public void saveScreenshot() { 
      Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 
      Canvas canvas = new Canvas(bitmap); 
      canvas.draw(myGiganticImage) 

      File file = new File(context.getFilesDir() + "/cache.jpg"); 
      FileOutputStream fos; 
      try { 
       fos = new FileOutputStream(file); 
       bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); 
       fos.close(); 

       cachedBackground = BitmapFactory.decodeFile(context.getFilesDir() + "/cache.jpg" 
       invalidate()     
      } catch (FileNotFoundException e) { 
      } catch (IOException e) { 
      } 
     } 

私は必要なときにこれをonDraw()で呼び出します。それは大きな画像ではなく、描画に使用できる内部メモリにビットマップを保存します。

+1

myGiganticImageとは何ですか? – Siddhesh

3

カスタムビューのコンストラクタで、setDrawingCacheEnabled(true);のように描画キャッシュを有効にします。次に、Canvasの状態を保存する場合は、getDrawingCache()と呼び出して、Bitmapを返します。

ドキュメント:あなたを助けるかもしれ後getDrawingCache()

+0

ここでは答えがありますが、私は画像で作業していると言っていますが、buildDrawingCacheはビューよりも大きく、ビューの可視部分が描画されているだけでキャッシュは保持される何が描かれているのですか?これを修正する方法はありますか?表示が画面より大きい間は、表示可能な画面のみをキャッシュする必要があります。 – Alin

+0

最初の文章は完全にはわかりません。また、この文脈で描かれたものと目に見えるものとの違いを明確にすることはできますか? – Thomas

+0

私は、ビューのコンテンツをキャッシュできるようにするには、ビューが画面のサイズより大きくてはならないことを読んでいます。したがって、800x480の画面上のカスタムビューで2000x1000ピクセルの画像で作業すると、ビューをキャッシュすることが不可能になります。私はテストを行い、キャッシュされたビットマップは空です。または私は何かが欠けている? – Alin

0

(1)

View v = view.getRootView(); 
    v.setDrawingCacheEnabled(true); 
    Bitmap b = v.getDrawingCache(); 

(2)これはHow to capture the android device screen content?

で別の質問に似ていますこのライブラリを試すことができます http://code.google.com/p/android-screenshot-library/これは、Androidのスクリーンショットライブラリ(ASL)を導入し、ルートアクセス権を必要とせずにAndroid搭載デバイスからスクリーンショットをプログラムでキャプチャすることを可能にします。

+0

(1)このコードはどこで実行する必要がありますか?私の活動では?そうであれば、他の要素を描画する直前に、onDraw内でgetDrawingCache()をリクエストする必要があるため、私のニーズには適していません。そして、これは私が以前説明したようにはうまくいきません。 (2)と(3)私はデバイスブート時にサービスを開始しているので、そのライブラリを使いたくない。ご協力ありがとうございました。 – Alin

1

あなたの描画では、キャンバスをビットマップで初期化します。 このビットマップの参照を保持し、必要に応じて保存します。

私はキャンバス上に描画し、それのためのキャンバスを作成し、私のビューのサイズでビットマップを作成する必要がまず、私は明確なものをkeppするに HERE

を必要なものについては本当に素晴らしい記事を見つけた