2016-04-03 70 views
0

我正在一個項目,使繪圖。Xamarin Android採取截圖

我不使用axml,因爲我在名爲filledpolygon的類中繪製了圖形,並在MainActivity中調用該函數。我只想在我的項目中截圖。有沒有基本的功能,我可以在onCreate方法中調用?所以,當程序運行時,它會自動截取屏幕截圖。我找到了除Xamarin平臺之外的答案。

+1

的可能的複製[如何編程採取Android的截圖?](http://stackoverflow.com/questions/2661536/how-to-programmatically-take-a-screenshot-in-android) –

回答

0

在您的視圖中,您可以運行以下代碼,它將截取屏幕截圖。我還沒有嘗試在OnCreate()之前運行它,因此您可能需要測試以確保視圖已完全呈現。

*編輯:根據this post您可能在OnCreate()中運行此代碼時遇到問題,因此您需要找到一個更好的位置。我無法弄清楚用戶在他發佈的鏈接中指的是什麼。

*編輯#2:剛剛發現Compress()由於PNG是無損的,因此未考慮質量參數(在下面列出爲0),但如果將格式更改爲JPEG格式,則可能需要因爲你的圖像看起來像垃圾,所以調出質量參數。

public byte[] SaveImage() { 

    DrawingCacheEnabled = true;     //Enable cache for the next method below 
    Bitmap bitmap  = GetDrawingCache(true); //Gets the image from the cache 

    byte[] bitmapData; 
    using(MemoryStream stream = new MemoryStream()) { 
     bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream); 
     bitmapData = stream.ToArray(); 
    } 

    return bitmapData; 
} 
+0

@Aniki:查看編輯,如果有幫助請標記爲答案。 – hvaughan3

+0

我一般新來的xamarin和android,但我怎麼能設置DrawingCacheEnabled爲真? VS向我報告名稱'DrawingCacheEnabled'在當前上下文中不存在。 – Lexu

+0

@Lexu您需要從您的Xamarin Android項目代碼中執行此操作。看到Amalan Dhananjayan在下面的答案,他設置view.DrawingCacheEnabled = true;' – hvaughan3

0

您可以使用此方法,該方法將返回您傳遞的活動的位圖。所以基本上,如果你是從自己的活動調用,那麼你可以簡單地通過'this'作爲當前活動來獲取截圖作爲位圖。 此外,我添加了一個小的修改,從屏幕截圖中刪除狀態欄。希望你明白了。

private Bitmap takeScreenShot(Activity activity) 
    { 
     View view = activity.Window.DecorView; 
     view.DrawingCacheEnabled = true; 
     view.BuildDrawingCache(); 
     Bitmap bitmap = view.DrawingCache; 
     Rect rect = new Rect(); 
     activity.Window.DecorView.GetWindowVisibleDisplayFrame(rect); 
     int statusBarHeight = rect.Top; 
     int width = activity.WindowManager.DefaultDisplay.Width; 
     int height = activity.WindowManager.DefaultDisplay.Height; 
     Bitmap screenShotBitmap = Bitmap.CreateBitmap(bitmap, 0, statusBarHeight, width, 
      height - statusBarHeight); 
     view.DestroyDrawingCache(); 
     return screenShotBitmap; 
    }