2016-08-30 5 views

答えて

7

をキャプチャするためにも必要

はダニエルHindrikesによってthisのブログ記事をご覧ください。

共有コードにPCLを使用すると仮定します。

PCLにインターフェイスを作成する必要があります。彼はそれをIScreenshotManagerと呼びます。宣言は次のようになります。

public interface IScreenshotManager 
{ 
    Task<byte[]> CaptureAsync(); 
} 

これで、すべてのプラットフォームで独自の実装が行われます。 iOSの場合。 Android用

public class ScreenshotManager : IScreenshotManager 
{ 
    public async System.Threading.Tasks.Task<byte[]> CaptureAsync() 
    { 
     var view = UIApplication.SharedApplication.KeyWindow.RootViewController.View; 

     UIGraphics.BeginImageContext(view.Frame.Size); 
     view.DrawViewHierarchy(view.Frame, true); 
     var image = UIGraphics.GetImageFromCurrentImageContext(); 
     UIGraphics.EndImageContext(); 

     using(var imageData = image.AsPNG()) 
     { 
      var bytes = new byte[imageData.Length]; 
      System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, bytes, 0, Convert.ToInt32(imageData.Length)); 
      return bytes; 
     } 

    } 
} 

public class ScreenshotManager : IScreenshotManager 
{ 
    public async Task<byte[]> CaptureAsync() 
    { 
     var rootFrame = Application.Current.RootVisual as PhoneApplicationFrame; 

     var screenImage = new WriteableBitmap((int)rootFrame.ActualWidth, (int)rootFrame.ActualHeight); 
     screenImage.Render(rootFrame, new MatrixTransform()); 
     screenImage.Invalidate(); 

     using (var stream = new MemoryStream()) 
     { 
      screenImage.SaveJpeg(stream, screenImage.PixelWidth, screenImage.PixelHeight, 0, 100); 
      var bytes = stream.ToArray(); 
      return bytes; 
     } 
    } 
} 

Dependency Serviceでそれを登録した属性を使用して、プラットフォーム固有の実装を登録することを忘れないでください、のような:

public class ScreenshotManager : IScreenshotManager 
{ 
    public static Activity Activity { get; set; } 

    public async System.Threading.Tasks.Task<byte[]> CaptureAsync() 
    { 
     if(Activity == null) 
     { 
      throw new Exception("You have to set ScreenshotManager.Activity in your Android project"); 
     } 

     var view = Activity.Window.DecorView; 
     view.DrawingCacheEnabled = true; 

     Bitmap bitmap = view.GetDrawingCache(true); 

     byte[] bitmapData; 

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

     return bitmapData; 
    } 
} 

とWindows Phone用

これは:

[assembly: Xamarin.Forms.Dependency (typeof (ScreenshotManager))] 

名前空間宣言の上になります。

var screenshotBytes = DependencyService.Get<IScreenshotManager>().CaptureAsync();

おそらくDependencyService.Get<IScreenshotManager>()がそれを使用する前にnullないかどうかを確認したい:

は、今すぐあなたの共有コードからあなたはこのような呼び出しでのスクリーンショットのbyte[]を取得することができるだろう。

その後、byte[]をイメージに変換して、好きなように操作できます。

+0

カメラビューをバックグラウンドとして使用しているときに画面をキャプチャしようとすると、画像にライブカメラビューが表示されません。 – DrPatience

+0

@DrPatienceライブカメラビューの解決策は見つかりましたか?私はその解決策を試みているが、何も見つけることができない。カメラの画面は常に黒く表示されます – user1796141

+0

すべてのプラットフォームで使用できますか? –

関連する問題