New in version 0.36.0

Released 10 months ago

Please remember to uno clean your projects after upgrading Fuse.


  • All Android builds now use Gradle and CMake. (No more -DGRADLE required)
    • Note: Google only provides 64bit support for these tools on Windows. If you have a 32bit Win machine you will no longer be able to export Android apps.
  • The new Harfbuzz text renderer is now default in local preview (and has received a lot of bug fixes)
  • UX expressions now also work on animators.
  • Added support for sharing text and files with other applications through the Fuse.Share package
  • And a lot of other bug fixes and changes. Read the full list for details (it's worth it!)
Harfbuzz text renderer
  • The Harfbuzz text renderer is now the default text renderer in local preview and desktop builds. The new renderer supports complex text with emoji, bidirectionality, ligatures, etc. It is also faster than the old renderer. It's also possible to use this text renderer on mobile devices by building with -DUSE_HARFBUZZ (just like before).
  • Fixed an issue where text elements with many lines would be measured incorrectly due to rounding.
  • Fixed a bunch of bugs in the desktop text edit control when using the Harfbuzz text renderer. Some examples of bugs that were fixed are:
    • Not being able to move to the first line if the text control started with multiple newlines.
    • The cursor moving before the inserted character when adding text on the first line if that line is empty.
    • The cursor jumping to the wrong position when moving left and right in certain bidirectional strings.
    • The caret ending up in slightly off positions when moving up or down in multi-line text.
All Android builds now use Gradle & CMake

What this means for you is as follows:

  • You no longer have to use the -DGRADLE flag when building for Gradle support
  • You will be able to use a simple Uno attribute to install any of the mountain of libraries available for the android platform via Maven & JCenter
  • The projects we generate should be compatible with Android Studio. Build with -d to open the project in AS. (Note: We currently aren't providing support for this workflow as changes to Android Studio are out of our control.)
  • If you haven't used Gradle builds before then you will probably need to do fuse install android again. The very first Android build you do will also take a bit longer than before, but after that it should be all good.

So what's the deal then? Back in 2013 Google announce they would be changing their supported build system to Gradle and that Ant would be deprecated. Since then Gradle and android have grown to the point where Gradle is now 'the way' to build and manage your dependencies for Android projects. The road for native development has been much rockier especially if, like us, you interact with Android from an external tool.

However we are finally in the position where we are happy enough with stability and compatibility that we are going to remove the deprecated Ant build system and switch to Gradle for all builds. We have been offering Gradle builds from Fuse using a build flag for a long time and the input from users has been invaluable.

This does however have an effect on what themes are available for Native widgets. The reason for this is that more and more 3rd party android libraries (such as Facebook's login UI) are using UI elements (or other features) not available on older android versions. To keep to our high standard of device & version compatibility this required us to switch from using to This provided compatibility versions of the APIs needed but means that the supported Android native themes must inherit from AppCompat.Theme

That means that the Holo will no longer work with Fuse apps although Theme.AppCompat, Theme.AppCompat.Light, etc will.

As always please reach out to us if you hit any issues.

  • Preview is now refreshed when moved between different density screens on macOS.
Android Manager
  • Several users have ran into 'Failed to find package cmake;3.6.3155560', this release contains a fix for that. However, please run fuse install android again if you've encountered it.
  • Fixed issue reported by a few users, where fuse install android might fail because of HTTPS issues.
Android Studio Details
  • We no longer generate the .iml files and instead let Android Studio do this.
  • Added Fuse.Share package enabling the sharing of text and files with other applications. Read more about the share module here.
Duotone effect
  • An effect that applies a duotone filter with customizable colors. Read more about Duotone here.
  • Added PointerCapture as an explicit way to capture the pointer and do compound controls (experimental). Learn more about the PointerCapture class.
UX Expressions
  • Fixed bugs which prevented use of UX bindings and expressions on animators, e.g. <Change foo.Value="{Resource bar} / 2"
  • UX expressions are now also supported in FileSource properties, e.g. <Image File="Assets/{img}.png" />. Remember to include the files in the :Bundle in your .unoproj.
  • Fixed inconsistencies with how Timeline implemented Resume, Pause, and Stop. They now work in the same fashion as other media playback, such as Video. If you happened to depend on the old behaviour you can use the new TimelineAction.
  • Added TimelineAction for extended control over a Timeline without mimicing media playback
  • Deprecated PlayTo, use TimelineAction instead
  • Deprecated Resume, use Play instead
  • Deprecated several items in IPlayback as they are redundant. It is strictly a simple playback interface now.
  • Fixed several layout issues with WrapPanel and WrapLayout
    • text should wrap correctly now
    • Padding is now applied
  • Added WrapPanel.RowAlignment to align contents to the top/bottom/center of a row
  • Fixed an incorrect change of ScrollingAnimation.Range if To or From were set. They would force an Explicit mode, but now only do that if the Range has not been set before. The behaviour of something like <ScrollingAnimation Range="SnapEnd" To="100"> thus changes (it was undefined before, and is still undefined behaviour, as SnapEnd doesn't accept To/From values)
  • Modified capturing on ScrollView and SwipeGesture to allow them to both exist on the same parent node and be usable at the same time.
  • Added CycleWaveform.Square
  • Added CycleWaveform.Offset
  • Json.Escape has been marked as obsolete, as it didn't correctly quote everything needed. Use Uno.Data.Json.JsonWriter.QuoteString instead. Note that JsonWriter.QuoteString also adds quotes around the result, so it's not a pure drop-in replacement.
  • Fixed a bug where changes to Page.Title were not propagated properly to Property-bindings.
  • Changed Brush to use premultiplied alpha rendering which resolves several unpleasant visual anomolies
  • Changed LinearGradient to interpolate using premultiplied alpha
  • Removed Brush.BlendMode as it wasn't working correctly, and cannot actually be supported correctly
  • Added LinearGradient.Interpolation and set the default to Linear. Previously this would, incorrectly, do a smoothed gradient. To get the previous behaviour use Interplation="Smooth", but note it is not supported on all renderers.
  • Fixed an issue where the animation Scale property was not applied at rooting time
  • PageResourceBinding has been marked as deprecated. Instead of <PageResourceBinding Target="Bar.Prop" Key="Foo" /> Use Prop="{Page Foo}" on Bar instead.
iOS Launch Options
  • Using foreign code you can now access the latest launch options in iOS apps as a ObjC.Object from the Uno.Platform.iOS.Application.LaunchOptions property.
.NET backend
  • Worked around an issue that resulted in errors like ERROR: Failed to compile .NET type 'XXX': The invoked member is not supported before the type is created. when using certain class attributes when compiling for .NET (e.g. local preview)
  • This package has been moved to the Uno repository. The following methods that were marked as obsolete in Fuse 0.33 have now been removed:
  • Socket.Send(byte[], int, int)
  • Socket.Receive(byte[], int, int)
  • JsonReader.AsStringOrDefault() has been marked as obsolete, and should be replaced with JsonReader.JsonDataType and JsonReader.AsString(), e.g code like foo.AsStringOrDefault() shoud become foo.JsonDataType == JsonDataType.String ? foo.AsString() : null.
  • The following JsonReader methods have been marked as obsolete, and should be replaced with calls to AsNumber() instead. The OrDefault variants should check JsonDataType first, similar to the previous point:
    • AsFloat()
    • AsFloatOrDefault()
    • AsDouble()
    • AsDoubleOrDefault()
    • AsInteger()
    • AsIntegerOrDefault()
  • JsonReader.AsBoolOrDefault() has been marked as obsolete, similar to the previous points, and need similar care.
  • IFrustum.GetProjectionTransform and IFrustum.TryGetProjectionTransformInverse has been changed signature to bool TryGet...(..., out float4x4) so attempts to divide by zero etc can be reported to the call-sites.

This is a series of advanced changes that should not affect UX level code.

  • The public interface of Input.Pointer has changed to allow for extended gesture support. There is a behaviour change that an identity can have only one capture now. Most use-cases involving a single finger/button likely already met this restriction.

If you capture multiple pointers and cannot easily switch to using ExtendCapture, you can also use a unique identity instead. Create a new object and use that identity as the second capture. This should work as it did before.

  • Added ExtendCapture to add additional points to an existing capture
  • Added ModifyCapture as a new high-level interface to the capture mechanism
  • Added Gesture to coordinate gesture support (experimental)
  • ReleaseAllCaptures renamed ReleaseCapture, since there can be only one
  • Removed Pointer.IsSoftCaptured and Pointer.IsHardCaptured in favour of just IsCapture.
  • The higher level PointerEventArgs still keeps many of the old entry points for compatbility/simplicity as it is more frequently used.
  • This deprecated package has been removed. If you for some reason depended on it, it can now be found here. Please note that this package is not actively maintaned nor supported. Use at your own risk ;)
  • The default setting for TextTruncation has changed from Standard to None. The Standard-setting is known not to work as expected on text-inputs, and the whole setting will probably be removed in an upcoming release. None of this applies to non-input controls.