Added the Android Forms renderer

This commit is contained in:
Matthew Leibowitz 2016-10-04 13:53:13 +02:00
Родитель fbe7f0759f
Коммит 0fb3035a0a
2 изменённых файлов: 103 добавлений и 0 удалений

Просмотреть файл

@ -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" />