2

MPAndroidChart を使用して、さまざまなグラフをレンダリングしています。グラフを画像としてギャラリーに保存する機能を追加したかったのです。この機能を使用するためにアクション バーにアイコンを追加しましたが、画像がギャラリーに保存されません。

コードは以下のとおりです。

<item android:id="@+id/save"
    android:icon="@drawable/ic_action_accept"
    android:title="@string/save"
    app:showAsAction="always"/>

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    switch (item.getItemId()) {
        case R.id.save :
            mlineChart.saveToGallery("Chart",50);
            return true;
        case R.id.action_settings :
            return true;
        default: return super.onOptionsItemSelected(item);
    }
}
4

2 に答える 2

5

Androidでプログラムでスクリーンショットを撮る方法から ?

// image naming and path  to include sd card  appending name you choose for file
String mPath = Environment.getExternalStorageDirectory().toString() + "/" + ACCUWX.IMAGE_APPEND;   
// create bitmap screen capture
Bitmap bitmap;
View v1 = mWebview.getRootView(); // take the view from your webview
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);

OutputStream fout = null;
imageFile = new File(mPath);

try {
  fout = new FileOutputStream(imageFile);
  bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
  fout.flush();
  fout.close();

} catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

アップデート

この非推奨を指摘してくれた tamim に感謝します。これが更新されたソリューションです

public void setDrawingCacheEnabled (ブール値が有効)

このメソッドは、API レベル 28 で非推奨になりました。API 11 でのハードウェア アクセラレーションによるレンダリングの導入により、ビュー描画キャッシュはほとんど廃止されました。ハードウェア アクセラレーションでは、中間キャッシュ レイヤーはほとんど不要であり、パフォーマンスの純損失を簡単にもたらす可能性があります。レイヤーの作成と更新のコストが原因です。アルファ アニメーションなど、レイヤーのキャッシュが役立つまれなケースでは、 setLayerType(int, android.graphics.Paint) がハードウェア レンダリングでこれを処理します。ビュー階層の小さな部分または個々のビューのソフトウェア レンダリング スナップショットの場合、ビットマップまたはピクチャからキャンバスを作成し、ビューで draw(android.graphics.Canvas) を呼び出すことをお勧めします。ただし、これらのソフトウェア レンダリングの使用は推奨されず、Config.HARDWARE ビットマップ、リアルタイム シャドウ、アウトライン クリッピングなどのハードウェアのみのレンダリング機能との互換性の問題があります。フィードバック レポートまたは単体テスト用の UI のスクリーンショットについては、PixelCopy API をお勧めします。

したがって、推奨事項に従って、UI のスクリーンショット/スナップショットを取得するためにPixelCopyを使用します。これは、API レベル 24 以降で使用できます。

PixelCopy.request(surfaceViewObject,BitmapDest,listener,new Handler());

どこ、

surfaceViewObject はサーフェス ビューのオブジェクトです

BitmapDest は、画像が保存されるビットマップ オブジェクトであり、null にすることはできません

リスナーは OnPixelCopyFinishedListener です

詳細については、Pixel Copy Android のドキュメントを参照してください。

于 2015-04-24T11:28:56.833 に答える