Plugin.CurlEffect
1.0.5
dotnet add package Plugin.CurlEffect --version 1.0.5
NuGet\Install-Package Plugin.CurlEffect -Version 1.0.5
<PackageReference Include="Plugin.CurlEffect" Version="1.0.5" />
<PackageVersion Include="Plugin.CurlEffect" Version="1.0.5" />
<PackageReference Include="Plugin.CurlEffect" />
paket add Plugin.CurlEffect --version 1.0.5
#r "nuget: Plugin.CurlEffect, 1.0.5"
#:package Plugin.CurlEffect@1.0.5
#addin nuget:?package=Plugin.CurlEffect&version=1.0.5
#tool nuget:?package=Plugin.CurlEffect&version=1.0.5
CurlEffect
A bindable, book-style page-curl control for .NET MAUI, rendered with SkiaSharp. Drag from any
edge to turn pages, or drive it programmatically with sync / async / ICommand APIs.
Install
dotnet add package Plugin.CurlEffect
Register the plugin in your MauiProgram (this also wires up SkiaSharp):
using CurlEffect.Controls;
builder.UseMauiApp<App>().UseCurlEffect();
Usage
xmlns:controls="clr-namespace:CurlEffect.Controls;assembly=CurlEffect"
<controls:CurlView x:Name="Curl"
ItemsSource="{Binding Pages}"
CurrentIndex="{Binding Index, Mode=TwoWay}"
TurnSpeed="Normal" />
Each page is painted by a PageDrawer / DrawPage callback (a default text drawer is used
otherwise), so a page can be anything you can draw on an SKCanvas.
Navigation API
All of the following exist as a method, an ...Async variant, and an ICommand:
| API | Behaviour |
|---|---|
Next() / Previous() |
Turn one page |
Animate(value) |
Animate to a view — non-negative = absolute index, negative = pages back from current; clamps to first/last |
AnimateFrom(origin, value) |
As above, but the curl grips from a CurlOrigin (TopLeft, TopRight, Middle, BottomRight, BottomLeft) |
AnimateToStart() / AnimateToEnd() |
Single-turn jump to the first/last view (intermediate views are not shown) |
StopAnimation() |
Halt an in-progress turn and settle |
TurnSpeed (Fast / Normal / Slow) is bindable and applies to every animated turn.
Use from any IView
The contract is exposed as ICurlView : IView, with extension methods on IView so the API can be
called on any view reference (a safe no-op when the view isn't curl-capable):
using CurlEffect.Controls;
IView view = GetSomeView();
await view.AnimateToEndAsync();
view.AnimateFrom(CurlOrigin.TopRight, 0);
if (view.IsCurlView()) view.Next();
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0-android36.0 is compatible. net10.0-ios26.0 is compatible. net10.0-maccatalyst26.0 is compatible. net10.0-windows10.0.19041 is compatible. |
-
net10.0-android36.0
- Microsoft.Maui.Controls (>= 10.0.20)
- SkiaSharp.Views.Maui.Controls (>= 3.119.4)
-
net10.0-ios26.0
- Microsoft.Maui.Controls (>= 10.0.20)
- SkiaSharp.Views.Maui.Controls (>= 3.119.4)
-
net10.0-maccatalyst26.0
- Microsoft.Maui.Controls (>= 10.0.20)
- SkiaSharp.Views.Maui.Controls (>= 3.119.4)
-
net10.0-windows10.0.19041
- Microsoft.Maui.Controls (>= 10.0.20)
- SkiaSharp.Views.Maui.Controls (>= 3.119.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
# Changelog
All notable changes to **Plugin.CurlEffect** are documented here. The format is based on
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project follows
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.0.5] - 2026-06-13
### Fixed
- **Page-curl drag now works on Android (and iOS).** The drag is driven from `SKCanvasView`'s
touch events on touch platforms; `PointerGestureRecognizer`, used previously, only reports
mouse/stylus pointers there and never delivered finger touch, so a drag never started a curl on
a real device. Desktop (Windows / Mac Catalyst) continues to use the pointer recognizer.
- **Android system back-gesture no longer hijacks an edge page-turn.** On gesture-navigation
devices a swipe from the screen edge is the system "back" gesture, which overlapped a backward
curl (grab the left edge, drag inward) and could close the app. The control now registers its
bounds as a system-gesture exclusion zone (API 29+).
### Added
- **`EdgeInset`** bindable property (also on `ICurlView`). Holds the touch-sensitive curl edge
away from the physical screen edge, covering the cases the platform's 200dp gesture-exclusion
cap can't reach. Defaults to `0`; the sample uses `24`.
## [1.0.4]
### Changed
- Include the `net10.0-windows` target in the NuGet package.
- Fixed the project URL and wired README content into the package release notes.