зеркало из https://github.com/mono/SkiaSharp.git
Added the Android Forms renderer
This commit is contained in:
Родитель
fbe7f0759f
Коммит
0fb3035a0a
|
@ -0,0 +1,102 @@
|
|||
using System;
|
||||
using System.ComponentModel;
|
||||
using Android.Content;
|
||||
using Android.Opengl;
|
||||
using Javax.Microedition.Khronos.Opengles;
|
||||
using Xamarin.Forms;
|
||||
using Xamarin.Forms.Platform.Android;
|
||||
|
||||
using SKFormsView = SkiaSharp.Views.Forms.SKGLView;
|
||||
using SKNativeView = SkiaSharp.Views.SKGLSurfaceView;
|
||||
|
||||
[assembly: ExportRenderer(typeof(SKFormsView), typeof(SkiaSharp.Views.Forms.SKGLViewRenderer))]
|
||||
|
||||
namespace SkiaSharp.Views.Forms
|
||||
{
|
||||
internal class SKGLViewRenderer : ViewRenderer<SKFormsView, SKNativeView>
|
||||
{
|
||||
protected override void OnElementChanged(ElementChangedEventArgs<SKFormsView> e)
|
||||
{
|
||||
if (e.OldElement != null)
|
||||
{
|
||||
var oldController = (ISKGLViewController)e.OldElement;
|
||||
|
||||
// unsubscribe from events
|
||||
oldController.SurfaceInvalidated -= OnSurfaceInvalidated;
|
||||
}
|
||||
|
||||
if (e.NewElement != null)
|
||||
{
|
||||
var newController = (ISKGLViewController)e.NewElement;
|
||||
|
||||
// create the native view
|
||||
var view = new SKNativeView(Context);
|
||||
view.SetRenderer(new Renderer(newController));
|
||||
SetNativeControl(view);
|
||||
|
||||
// subscribe to events from the user
|
||||
newController.SurfaceInvalidated += OnSurfaceInvalidated;
|
||||
|
||||
// start the rendering
|
||||
SetRenderMode();
|
||||
}
|
||||
|
||||
base.OnElementChanged(e);
|
||||
}
|
||||
|
||||
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
base.OnElementPropertyChanged(sender, e);
|
||||
|
||||
// refresh the render loop
|
||||
if (e.PropertyName == SKFormsView.HasRenderLoopProperty.PropertyName)
|
||||
{
|
||||
SetRenderMode();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
// detach all events before disposing
|
||||
var controller = (ISKGLViewController)Element;
|
||||
if (controller != null)
|
||||
{
|
||||
controller.SurfaceInvalidated -= OnSurfaceInvalidated;
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
// the user asked to repaint
|
||||
private void OnSurfaceInvalidated(object sender, EventArgs eventArgs)
|
||||
{
|
||||
// if we aren't in a loop, then refresh once
|
||||
if (!Element.HasRenderLoop)
|
||||
{
|
||||
Control.RequestRender();
|
||||
}
|
||||
}
|
||||
|
||||
private void SetRenderMode()
|
||||
{
|
||||
Control.RenderMode = Element.HasRenderLoop
|
||||
? Rendermode.Continuously
|
||||
: Rendermode.WhenDirty;
|
||||
}
|
||||
|
||||
private class Renderer : SKNativeView.ISKRenderer
|
||||
{
|
||||
private readonly ISKGLViewController controller;
|
||||
|
||||
public Renderer(ISKGLViewController controller)
|
||||
{
|
||||
this.controller = controller;
|
||||
}
|
||||
|
||||
public void OnDrawFrame(SKSurface surface, GRBackendRenderTargetDesc renderTarget)
|
||||
{
|
||||
controller.OnPaintSurface(new SKPaintGLSurfaceEventArgs(surface, renderTarget));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -84,6 +84,7 @@
|
|||
<ItemGroup>
|
||||
<Compile Include="Resources\Resource.designer.cs" />
|
||||
<Compile Include="SKCanvasViewRenderer.cs" />
|
||||
<Compile Include="SKGLViewRenderer.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
|
|
Загрузка…
Ссылка в новой задаче