屏幕截图 Xamarin.Forms
Screen snapshot Xamarin.Forms
我有以下 Xaml 代码:
<StackLayout>
<Button Text="Take a picture" Clicked="Button_Clicked_1" />
<Grid x:Name="MainPageBluePrintGrid" BackgroundColor="BlueViolet" HeightRequest="100">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Text="A" Grid.Row="0" Grid.Column="0"/>
<Label Text="B" Grid.Row="0" Grid.Column="1"/>
<Label Text="C" Grid.Row="0" Grid.Column="2"/>
<Image x:Name="image1" Grid.Row="1" Grid.Column="0"/>
<Image x:Name="image2" Grid.Row="1" Grid.Column="1"/>
<Image x:Name="image3" Grid.Row="1" Grid.Column="2"/>
</Grid>
<StackLayout BackgroundColor="BurlyWood">
<Image x:Name="CapturedImage"/>
</StackLayout>
</StackLayout>
第二行是用户选择的图片。是否可以只截取GridView第二行的截图,并显示在<Image x:Name="CapturedImage"/>
中。我搜索了如何操作,但我只遇到了全屏捕获,这对我来说并不理想。
听起来您想创建特定 Xamarin.Forms.View
的快照。您应该将第二个 Grid.Row
包裹在一个顶层 View
中,该层将包含子图像。之后,您可以使用特定于平台的功能来创建快照。
Android
public void MakeViewShot(Xamarin.Forms.View view)
{
var nativeView = view.GetRenderer().View;
var wasDrawingCacheEnabled = nativeView.DrawingCacheEnabled;
nativeView.DrawingCacheEnabled = true;
nativeView.BuildDrawingCache(false);
var bitmap = nativeView.GetDrawingCache(false);
// TODO: Save bitmap and return filepath
nativeView.DrawingCacheEnabled = wasDrawingCacheEnabled;
}
iOS
public void MakeViewShot(Xamarin.Forms.View view)
{
var nativeView = Xamarin.Forms.Platform.iOS.Platform.GetRenderer(view).NativeView;
UIGraphics.BeginImageContextWithOptions(nativeView.Bounds.Size, opaque: true, scale: 0);
nativeView.DrawViewHierarchy(nativeView.Bounds, afterScreenUpdates: true);
var image = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
// TODO: Save bitmap and return filepath
}
用法示例:
<StackLayout
x:Name="secondRow"
Grid.Row="1">
<Image x:Name="image1" />
<Image x:Name="image2" />
<Image x:Name="image3" />
</StackLayout>
MakeViewShot(secondRow);
我有以下 Xaml 代码:
<StackLayout>
<Button Text="Take a picture" Clicked="Button_Clicked_1" />
<Grid x:Name="MainPageBluePrintGrid" BackgroundColor="BlueViolet" HeightRequest="100">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Text="A" Grid.Row="0" Grid.Column="0"/>
<Label Text="B" Grid.Row="0" Grid.Column="1"/>
<Label Text="C" Grid.Row="0" Grid.Column="2"/>
<Image x:Name="image1" Grid.Row="1" Grid.Column="0"/>
<Image x:Name="image2" Grid.Row="1" Grid.Column="1"/>
<Image x:Name="image3" Grid.Row="1" Grid.Column="2"/>
</Grid>
<StackLayout BackgroundColor="BurlyWood">
<Image x:Name="CapturedImage"/>
</StackLayout>
</StackLayout>
第二行是用户选择的图片。是否可以只截取GridView第二行的截图,并显示在<Image x:Name="CapturedImage"/>
中。我搜索了如何操作,但我只遇到了全屏捕获,这对我来说并不理想。
听起来您想创建特定 Xamarin.Forms.View
的快照。您应该将第二个 Grid.Row
包裹在一个顶层 View
中,该层将包含子图像。之后,您可以使用特定于平台的功能来创建快照。
Android
public void MakeViewShot(Xamarin.Forms.View view)
{
var nativeView = view.GetRenderer().View;
var wasDrawingCacheEnabled = nativeView.DrawingCacheEnabled;
nativeView.DrawingCacheEnabled = true;
nativeView.BuildDrawingCache(false);
var bitmap = nativeView.GetDrawingCache(false);
// TODO: Save bitmap and return filepath
nativeView.DrawingCacheEnabled = wasDrawingCacheEnabled;
}
iOS
public void MakeViewShot(Xamarin.Forms.View view)
{
var nativeView = Xamarin.Forms.Platform.iOS.Platform.GetRenderer(view).NativeView;
UIGraphics.BeginImageContextWithOptions(nativeView.Bounds.Size, opaque: true, scale: 0);
nativeView.DrawViewHierarchy(nativeView.Bounds, afterScreenUpdates: true);
var image = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
// TODO: Save bitmap and return filepath
}
用法示例:
<StackLayout
x:Name="secondRow"
Grid.Row="1">
<Image x:Name="image1" />
<Image x:Name="image2" />
<Image x:Name="image3" />
</StackLayout>
MakeViewShot(secondRow);