我有一個自定義的平鋪視圖,直到最近基於SurfaceView。我現在已經改變它來擴展TextureView。屏幕截圖TextureView是使用DrawingCache黑色
基本上我得到一個大的圖像瓷磚位。
我需要捕獲屏幕的所有內容並將其保存爲位圖,該位圖已與所有視圖(包括SurfaceView)一起使用。但是,當我現在使用相同的方法時,TextureView的區域是黑色的。我已經讀過,這與HW加速有關。
有什麼方法捕捉紋理視圖的圖像? 以下是截屏方法。
public File takeScreenShot(View contentView)
{
File result = null;
String mPath = this.cacheDir + "/screenshot.png";
File imageFile = new File(mPath);
if (imageFile.exists()) {
imageFile.delete();
Log.i("ImageManager","Old screenshot image was deleted");
}
// create bitmap screen capture
Bitmap bitmap;
View v1 = contentView;
v1.setDrawingCacheEnabled(true);
v1.setDrawingCacheBackgroundColor(Color.WHITE);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
outputStream.flush();
outputStream.close();
result = imageFile;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
編輯:新嘗試 獲取所有TextureViews並調用getBitmap。這是有效的,但是將它們放在較大的位圖頂部看起來與來自TilingView self或getLocation OnScreen()或getLocationInWindow()的座標不正確。
public List<TilingTextureView> getAllTextureViews(View view)
{
List<TilingTextureView> tilingViews = new ArrayList<TilingTextureView>();
if (view instanceof TilingTextureView) {
tilingViews.add((TilingTextureView)view);
}
else if(view instanceof ViewGroup)
{
ViewGroup viewGroup = (ViewGroup)view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
tilingViews.addAll(getAllTextureViews(viewGroup.getChildAt(i)));
}
}
return tilingViews;
}
在獲取整個視圖的屏幕截圖後,該位將添加到takeScreenShot方法中。
List<TilingTextureView> tilingViews = getAllTextureViews(contentView);
if (tilingViews.size() > 0) {
Canvas canvas = new Canvas(bitmap);
for (TilingTextureView tilingTextureView : tilingViews) {
Bitmap b = tilingTextureView.getBitmap(tilingTextureView.getWidth(), tilingTextureView.getHeight());
int[] location = new int[2];
tilingTextureView.getLocationInWindow(location);
int[] location2 = new int[2];
tilingTextureView.getLocationOnScreen(location2);
canvas.drawBitmap(b, location[0], location[1], null);
}
}
這實際上工作。我只需根據父視圖相對於屏幕位置來修正圖像。 – MHolst
如果你解決了你的問題,在回答中發佈解決方案並接受它。 –