Kotlin/Native interop to libui: a portable GUI library

Overview

kotlin-libui

Kotlin/Native bindings to the libui C library.

Build Status Build status

libui is a C lightweight multi-platform UI library using native widgets on Linux (Gtk3), macOS, and Windows. Using this bindings you can develop cross-platform but native-looking GUI programs, written in Kotlin, and compiled to small native executable file.

Using

To use this library in your project you can clone Hello World application and use it as starting point.

Building

Cross-platform build is automated using Travis for Linux and macOS targets, and AppVeyor for Windows targets. Just create release on GitHub, and executable files for all 3 major desktop platforms will be compiled and attached to release.

For local build use ./gradlew build on Linux or macOS, or gradlew build on Windows. In this case only one - native for your platform - file will be built.

The script below builds kotlin-libui then builds and runs the sample hello-ktx:

#clone this project
git clone https://github.com/msink/kotlin-libui.git

#build libui.klib
cd kotlin-libui/libui
../gradlew build

#build and run the hello-ktx sample
cd ../samples/hello-ktx/
../../gradlew run

You can use IntelliJ IDEA CE/UE or CLion EAP for code navigation and code completion, debugging works only in CLion.

Status

Warning: currently it is just a prototype - works in most cases, but not protected from errors. And as both libui and Kotlin/Native are currently in alpha stage, anything can change.

Well, I'm also not sure about DSL syntax - it works, and for now is good enough. Let's leave it as is for a while.

If anyone have ideas - Issues and PullRequests are welcome.

Hello World

Let's start from minimal sample application - single button and single scrollable text area.

Screenshots:

Windows

Unix

macOS


C implementation:
#include "ui.h"

static int onClosing(uiWindow *window, void *data)
{
    uiQuit();
    return 1;
}

static void saySomething(uiButton *button, void *data)
{
    uiMultilineEntryAppend(uiMultilineEntry(data),
        "Hello, World!  Ciao, mondo!\n"
        "Привет, мир!  你好,世界!\n\n");
}

int main(void)
{
    uiInitOptions options;
    uiWindow *window;
    uiBox *box;
    uiButton *button;
    uiMultilineEntry *scroll;

    memset(&options, 0, sizeof(options));
    if (uiInit(&options) != NULL)
        abort();

    window = uiNewWindow("Hello", 320, 240, 0);
    uiWindowSetMargined(window, 1);

    box = uiNewVerticalBox();
    uiBoxSetPadded(box, 1);
    uiWindowSetChild(window, uiControl(box));

    scroll = uiNewMultilineEntry();
    uiMultilineEntrySetReadOnly(scroll, 1);

    button = uiNewButton("libui говорит: click me!");
    uiButtonOnClicked(button, saySomething, scroll);
    uiBoxAppend(box, uiControl(button), 0);

    uiBoxAppend(box, uiControl(scroll), 1);

    uiWindowOnClosing(window, onClosing, NULL);
    uiControlShow(uiControl(window));
    uiMain();
    return 0;
}

Direct translation to Kotlin:
import kotlinx.cinterop.*
import libui.*

fun main(args: Array<String>) = memScoped {
    val options = alloc<uiInitOptions>()
    val error = uiInit(options.ptr)
    if (error != null) throw Error("Error: '${error.toKString()}'")

    val window = uiNewWindow("Hello", 320, 240, 0)
    uiWindowSetMargined(window, 1)

    val box = uiNewVerticalBox()
    uiBoxSetPadded(box, 1)
    uiWindowSetChild(window, box?.reinterpret())

    val scroll = uiNewMultilineEntry()
    uiMultilineEntrySetReadOnly(scroll, 1)
    val button = uiNewButton("libui говорит: click me!")
    fun saySomething(button: CPointer<uiButton>?, data: COpaquePointer?) {
        uiMultilineEntryAppend(data?.reinterpret(),
            "Hello, World!  Ciao, mondo!\n" +
            "Привет, мир!  你好,世界!\n\n")
    }
    uiButtonOnClicked(button, staticCFunction(::saySomething), scroll)
    uiBoxAppend(box, button?.reinterpret(), 0)
    uiBoxAppend(box, scroll?.reinterpret(), 1)

    fun onClosing(window: CPointer<uiWindow>?, data: COpaquePointer?): Int {
        uiQuit()
        return 1
    }
    uiWindowOnClosing(window, staticCFunction(::onClosing), null)
    uiControlShow(window?.reinterpret())
    uiMain()
    uiUninit()
}

While this works, it's far from idiomatic Kotlin.

OK, let's wrap all that noisy function calls, with final goal to get something similar to TornadoFX:

import libui.*

fun main(args: Array<String>) = appWindow(
    title = "Hello",
    width = 320,
    height = 240
) {
    vbox {
        lateinit var scroll: TextArea

        button("libui говорит: click me!") {
            action {
                scroll.append("""
                    |Hello, World!  Ciao, mondo!
                    |Привет, мир!  你好,世界!
                    |
                    |""".trimMargin())
            }
        }
        scroll = textarea {
            readonly = true
            stretchy = true
        }
    }
}

More samples

Documentation

See autogenerated documentation, samples and comments in source code.

Lifecycle management

Kotlin memory management differs from native C model, so all libui objects are wrapped in Kotlin objects inherited from Disposable, and direct using of libui functions is not recommended in most cases.

Disposable objects must be disposed by calling dispose() method, before program ends. Most objects are attached as a child to some other object, in this case parent is responsible to dispose all its children, recursively. As DSL builders automatically add created object to some container - in most cases you do not have to worry about lifecycle management. But if you want to do something not supported by DSL builders - you can create Disposable object directly, and in this case you are responsible to dispose or attach it at some point.

Comments
  • Cleanup gradle setup and generify samples project

    Cleanup gradle setup and generify samples project

    The general purpose of this branch as to introduce kotlin-multiplatform. Since you have done this already in the meantime, we wanted to share the other changes we did while integrationg kotlin-multiplatform. Below you find a rough summary of what is included.

    • Generify samples project
      • move samples resources to upper level
      • create upper-level build.gradle to use in every sample
    • Clean up gradle project
      • Remove unnecessary repository declarations
      • Remove pluginMangement block
      • Use new plugin syntax wherever possible
      • Reduce duplications, etc.

    We tested it on all platforms (windows, linux and macOS) and a clean build as well as building the documentations with dokka worked. We tested all samples by hand and they all seemed to work like before.

    We kept the multiple targets, but did not test if it works together with CLion.

    opened by mervyn-mccreight 8
  • Does not compile

    Does not compile

    ➜  kotlin-libui git:(master) ./gradlew build
    Starting a Gradle Daemon (subsequent builds will be faster)
    
    > Task :libui:compileKonanLibuiLinux_x64 FAILED
    Exception in thread "main" java.lang.Error: /tmp/tmp4030171382076881273.c:1:10: fatal error: 'ui.h' file not found
            at org.jetbrains.kotlin.native.interop.indexer.UtilsKt.ensureNoCompileErrors(Utils.kt:145)
            at org.jetbrains.kotlin.native.interop.indexer.IndexerKt.indexDeclarations(Indexer.kt:916)
            at org.jetbrains.kotlin.native.interop.indexer.IndexerKt.buildNativeIndexImpl(Indexer.kt:906)
            at org.jetbrains.kotlin.native.interop.indexer.NativeIndexKt.buildNativeIndex(NativeIndex.kt:56)
            at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.processCLib(main.kt:242)
            at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.interop(main.kt:36)
            at org.jetbrains.kotlin.cli.utilities.InteropCompilerKt.invokeInterop(InteropCompiler.kt:88)
            at org.jetbrains.kotlin.cli.utilities.MainKt.main(main.kt:18)
    
    FAILURE: Build failed with an exception.
    

    Looks like I am missing a library?

    opened by nickhristov 8
  • "ld.lld: error: unable to find library" on CentOS7

    Hello. I tried to work hello-ktx sample according to README in this project. But it doesn't work and output this error.

    Task :samples:controlgallery:linkReleaseExecutableLinux FAILED /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lgtk-3 /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lgdk-3 /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -latk-1.0 /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lgio-2.0 /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lpangocairo-1.0 /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lgdk_pixbuf-2.0 /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lcairo-gobject /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lpango-1.0 /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lcairo /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lgobject-2.0 /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: unable to find library -lglib-2.0 e: /home/komkomh/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld invocation reported errors FAILURE: Build failed with an exception.

    My os version is CentOS Linux release 7.6.1810 (Core)

    Please give me a hint. Thanks

    opened by komkomh 6
  • Switch to kotlin-multiplatform plugin

    Switch to kotlin-multiplatform plugin

    Hi, this is awesome!

    Is there an easy way to add kotlin-libui as a dependency when I create a new project, or does kotlin-libui have to be in the parent gradle project?

    opened by andreas-mausch 6
  • Use contracts for block initializers

    Use contracts for block initializers

    Since everything here is experimental so far I think it's ok to add another useful experimental feature. However it's not something which could break overall functionality

    opened by Creeperface01 4
  • Add bindings to set font without using font button and updated drawte…

    Add bindings to set font without using font button and updated drawte…

    …xt sample to demonstrate usage.

    This might not be necessary but I could not find a way in kotlin-libui to specify a font other than using a fontButton as I couldn't find kotlin bindings to the uiFontDescriptor struct that allowed setting:

    char *Family;
    double Size;
    uiTextWeight Weight;
    uiTextItalic Italic;
    uiTextStretch Stretch;
    

    I created a binding to allow creating a font that specifies those properties however this is my first time using kotlin native and I am receiving an error upon close of the sample due to leaked data as shown below:

    ** (drawtext.kexe:9779): CRITICAL **: 13:48:33.189: [libui] /home/travis/build/msink/libui/unix/alloc.c:42:uiprivUninitAlloc() You have a bug: Some data was leaked; either you left a uiControl lying around or there's a bug in libui itself. Leaked data:
    0x105fb20 uiAttribute
    0x105fb80 char[] (uiAttribute)
    

    Any assistance in how to better define the bindings for uiFontDescriptor or fixing the memory leak would be appreciated.

    opened by illiapoplawski 4
  • libtinfo.so.5: cannot open shared object file: No such file or directory

    libtinfo.so.5: cannot open shared object file: No such file or directory

    ▶ ./gradlew build
    
    Welcome to Gradle 5.5-rc-3!
    
    Here are the highlights of this release:
     - Kickstart Gradle plugin development with gradle init
     - Distribute organization-wide Gradle properties in custom Gradle distributions
     - Transform dependency artifacts on resolution
    
    For more details see https://docs.gradle.org/5.5-rc-3/release-notes.html
    
    Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details
    
    > Task :buildSrc:compileKotlin
    The `kotlin-dsl` plugin applied to project ':buildSrc' enables experimental Kotlin compiler features. For more information see https://docs.gradle.org/5.5-rc-3/userguide/kotlin_dsl.html#sec:kotlin-dsl_plugin
    
    > Task :buildSrc:compileJava NO-SOURCE
    > Task :buildSrc:compileGroovy NO-SOURCE
    > Task :buildSrc:pluginDescriptors UP-TO-DATE
    > Task :buildSrc:processResources NO-SOURCE
    > Task :buildSrc:classes UP-TO-DATE
    > Task :buildSrc:inspectClassesForKotlinIC UP-TO-DATE
    > Task :buildSrc:jar UP-TO-DATE
    > Task :buildSrc:assemble UP-TO-DATE
    > Task :buildSrc:compileTestKotlin NO-SOURCE
    > Task :buildSrc:pluginUnderTestMetadata UP-TO-DATE
    > Task :buildSrc:compileTestJava NO-SOURCE
    > Task :buildSrc:compileTestGroovy NO-SOURCE
    > Task :buildSrc:processTestResources NO-SOURCE
    > Task :buildSrc:testClasses UP-TO-DATE
    > Task :buildSrc:test NO-SOURCE
    > Task :buildSrc:validateTaskProperties UP-TO-DATE
    > Task :buildSrc:check UP-TO-DATE
    > Task :buildSrc:build UP-TO-DATE
    
    > Configure project :libui
    Kotlin Multiplatform Projects are an experimental feature.
    publishModeEnabled: false
    
    The Kotlin source set commonTest was configured but not added to any Kotlin compilation. You can add a source set to a target's compilation by connecting it with the compilation's default source set using 'dependsOn'.
    See https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#connecting-source-sets
    
    > Task :libui:downloadArchive UP-TO-DATE
    > Task :libui:unpackArchive UP-TO-DATE
    
    > Task :libui:cinteropLibuiLinux FAILED
    Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/bruno/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/lib/libclang.so.6.0: libtinfo.so.5: cannot open shared object file: No such file or directory
            at java.lang.ClassLoader$NativeLibrary.load(Native Method)
            at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
            at java.lang.Runtime.load0(Runtime.java:809)
            at java.lang.System.load(System.java:1086)
            at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.prepareTool(main.kt:297)
            at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.processCLib(main.kt:176)
            at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.interop(main.kt:38)
            at org.jetbrains.kotlin.cli.utilities.InteropCompilerKt.invokeInterop(InteropCompiler.kt:70)
            at org.jetbrains.kotlin.cli.utilities.MainKt.main(main.kt:18)
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':libui:cinteropLibuiLinux'.
    > Process 'command '/usr/lib/jvm/java-8-openjdk/bin/java'' finished with non-zero exit value 1
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    
    * Get more help at https://help.gradle.org
    
    Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
    Use '--warning-mode all' to show the individual deprecation warnings.
    See https://docs.gradle.org/5.5-rc-3/userguide/command_line_interface.html#sec:command_line_warnings
    
    BUILD FAILED in 8s
    3 actionable tasks: 1 executed, 2 up-to-date
    
    

    os: MANJARO linux 5.1.15

    opened by eEQK 3
  • Depends on old version of libcrypt

    Depends on old version of libcrypt

    When executing an application created with this library on linux, it looks for libcrypt.so.1 which on Arch Linux has been deprecated and replaced with libcrypt.so.2. This issue can be solved simply by creating a symlink, which means theres no compatibility issues requiring the older version of the library, so I would recommend updating the dependency to the newer version.

    opened by squidink7 2
  • Had to change linkerOpts.linux on Manjaro

    Had to change linkerOpts.linux on Manjaro

    libui/libui.def

    -linkerOpts.linux = -L/usr/lib/x86_64-linux-gnu \
    +linkerOpts.linux = -L/usr/lib \
    

    Not sure if this can be set automatically to the correct directory on all systems. Maybe just document somewhere that you might need to adjust the value?

    gradle.output.txt

    opened by andreas-mausch 2
  • Update the kotlin libraries version

    Update the kotlin libraries version

    This fix the master build problem, as the version "1.3.70-eap-42" is not available anymore in the bintray repository. The "1.3.71-release-385" is the latest one from 1.3 versions.

    opened by AraujoJordan 0
  • Simplify widgets creation

    Simplify widgets creation

    This PR adds a lambda to some widgets to avoid using the apply scope function to setup the instance created. It also has a default value so those who want to use apply anyway can do without problems.

    Before

    val button = Button(text = "Click").apply {
        action {
            println("Hello World")
        }
    }
    

    After

    val button = Button(text = "Click") {
        action {
            println("Hello World")
        }
    }
    
    opened by lucasvalenteds 0
  • Release on maven central?

    Release on maven central?

    This is awesome that you've put this project together and continue to maintain it. I'm trying to think of an easy way to add it to an app, and it's not an easy process. It'd be amazing if this were on maven central so we could pull it naturally as a dependency!

    opened by ScottPierce 7
  • [Documentation] could this example https://github.com/msink/kotlin-libui/tree/master/samples/drawtext be explained a bit better?

    [Documentation] could this example https://github.com/msink/kotlin-libui/tree/master/samples/drawtext be explained a bit better?

    https://github.com/msink/kotlin-libui/tree/master/samples/drawtext

    Namely I wonder how the text is written, so that it appears like that. Could the readme there briefly explain how this is done?

    I am reading the source code but I am still a kotlin noob so ...

    opened by rubyFeedback 0
  • Integrate with Jetbrains Compose

    Integrate with Jetbrains Compose

    I noticed in this project's README that you weren't sure about the DSL.

    Well, what if we changed the DSL over to Android/Jetbrains Compose? It seems like fun idea because:

    • Take advantage of the tree-building and reactivity built into compose
    • Compose is gaining traction & mind-share, so this project might be more approachable by sharing concepts
    • Improved code sharing; e.g. you could use expect/actual to build common interfaces that work across both Android and native desktop.
    • Jetbrains is already working on Compose Desktop, but some devs (myself included) disapprove of using Skia canvas instead of native platform widgets for reasons of accessibility/etc.. Plus, it's on the JVM and not Kotlin/native. So we could create a nice alternative to fill a different niche.

    I'm just brainstorming, but I'm hoping to have some time to explore this myself, thought the idea was worth sharing.

    opened by brianguertin 5
  • Can't use MsgBox in worker

    Can't use MsgBox in worker

    I'm trying to run a background task using a worker and display a message when an exception is caught.

    Here's a minimal reproducible example:

    package example
    
    import kotlin.native.concurrent.TransferMode
    import kotlin.native.concurrent.Worker
    import libui.ktx.*
    
    fun main() = appWindow("Test", 800, 600) {
        vbox {
            button("Test") {
                action {
                    Worker.start().execute(TransferMode.UNSAFE, {}) {
                        MsgBox("This doesn't work")
                    }
                }
            }
        }
    }
    

    That fails with this error when clicking the button:

    Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: Trying to access top level value not marked as @ThreadLocal or @SharedImmutable from non-main thread
            at ThrowIncorrectDereferenceException (0x232c5c)
            at kfun:example.$<bridge-UNNN>main$lambda-2$<anonymous>_3_6$<anonymous>_5_8(kotlin.Unit)#internal (0x2485c0)
            at _ZN6Worker19processQueueElementEb (0x25d2ac)
            at _ZN12_GLOBAL__N_113workerRoutineEPv (0x25d96d)
            at  (0x7f70ac741422)
            at clone (0x7f70ac656bf3)
            at  ((nil))
    

    • platform: Linux x86_64
    • kotlin: 1.3.72
    • kotlin-libui: 0.1.7
    • coroutines: 1.3.5-native-mt
    opened by ObserverOfTime 0
  • User guide/Documentation

    User guide/Documentation

    Despite two years have passed since the moment when this problem had been outlined for the first time, there is still no documentation. I'm a newbie to both Kotlin|NAtive and GUI. I found that I simply cannot do even the simplest things without documents.

    Can anybody assist me in providing at least full-functional (and not few simple samples) examples of coding GUI using libui? I need to build a very simple application:

    1. Initialize window
    2. Initialize menu
    3. Input several common project data (the algorithm is to check the input and do not allow incorrect data)
    4. Output these data to the screen
    5. Switch to the next screen
    6. Input several particular project item data
    7. Output them to the table on the screen
    8. Perform calculations.
    9. Switch to the next screen
    10. Output the results to the screen
    11. Calculate one more version?
    12. If Yes - goto 6
    13. If No - do nothing

    Thank you.

    opened by ky8585 1
Releases(0.1.8)
Owner
Mike Sinkovsky
Mike Sinkovsky
Make your native android Dialog Fancy. A library that takes the standard Android Dialog to the next level with a variety of styling options. Style your dialog from code.

FancyAlertDialog-Android Prerequisites Add this in your root build.gradle file (not your module build.gradle file): allprojects { repositories { ..

Shashank Singhal 350 Dec 9, 2022
:bread: Make your native android Toasts Tasty

TastyToast Make your native android toast look beautiful. Preview About Refer Here Wiki Grab the above demo app from here : Dependency Add dependency

Rahul Yadav 2k Dec 29, 2022
Display code with syntax highlighting :sparkles: in native way.

CodeView (Android) CodeView helps to show code content with syntax highlighting in native way. Description CodeView contains 3 core parts to implement

Kirill Biakov 827 Dec 22, 2022
MIUINativeNotifyIcon - Fix the native notification bar icon function abandoned by the MIUI development team

MIUI 原生通知图标 Fix the native notification bar icon function abandoned by the MIUI

Fankesyooni 189 Jan 4, 2023
Rn-scratch-card - React Native Scratch Card which temporarily hides content from user

rn-scratch-card React Native Scratch Card which temporarily hides content from a

Sweatcoin 54 Jan 4, 2023
Provenance-eventstream-legacy-kotlin - A legacy Kotlin library for reading from the Provenance event stream

provenance-eventstream-legacy-kotlin A legacy Kotlin library for reading from th

Figure Technologies Inc. 1 Jan 13, 2022
Android StackBlur is a library that can perform a blurry effect on a Bitmap based on a gradient or radius, and return the result. The library is based on the code of Mario Klingemann.

Android StackBlur Android StackBlur is a library that can perform a blurry effect on a Bitmap based on a gradient or radius, and return the result. Th

Enrique López Mañas 3.6k Dec 29, 2022
A new canvas drawing library for Android. Aims to be the Fabric.js for Android. Supports text, images, and hand/stylus drawing input. The library has a website and API docs, check it out

FabricView - A new canvas drawing library for Android. The library was born as part of a project in SD Hacks (www.sdhacks.io) on October 3rd. It is cu

Antwan Gaggi 1k Dec 13, 2022
Android library providing bread crumbs to the support library fragments.

Hansel And Gretel Android library providing bread crumbs for compatibility fragments. Usage For a working implementation of this project see the sampl

Jake Wharton 163 Nov 25, 2022
Kotlin Wrapper Library of Material-UI

kotlin-material-ui Kotlin Wrapper Library of Material-UI Core: Lab: Installation repositories { jcenter() // or maven { url 'https://dl.bintra

Subroh Nishikori 78 Nov 24, 2022
A Tinder-like Android library to create the swipe cards effect. You can swipe left or right to like or dislike the content.

Swipecards Travis master: A Tinder-like cards effect as of August 2014. You can swipe left or right to like or dislike the content. The library create

Dionysis Lorentzos 2.3k Dec 9, 2022
A Material design Android pincode library. Supports Fingerprint.

LolliPin A Lollipop material design styled android pincode library (API 14+) To include in your project, add this to your build.gradle file: //Loll

Omada Health 1.6k Nov 25, 2022
Android Library to implement simple touch/tap/swipe gestures

SimpleFingerGestures An android library to implement simple 1 or 2 finger gestures easily Example Library The library is inside the libSFG folder Samp

Arnav Gupta 315 Dec 21, 2022
Useful library to use custom fonts in your android app

EasyFonts A simple and useful android library to use custom fonts in android apps without adding fonts into asset/resource folder.Also by using this l

Vijay Vankhede 419 Sep 9, 2022
Android library which allows you to swipe down from an activity to close it.

Android Sliding Activity Library Easily create activities that can slide vertically on the screen and fit well into the Material Design age. Features

Jake Klinker 1.3k Nov 25, 2022
This library provides a simple way to add a draggable sliding up panel (popularized by Google Music and Google Maps) to your Android application. Brought to you by Umano.

Note: we are not actively responding to issues right now. If you find a bug, please submit a PR. Android Sliding Up Panel This library provides a simp

Umano: News Read To You 9.4k Dec 31, 2022
An Android library supports badge notification like iOS in Samsung, LG, Sony and HTC launchers.

ShortcutBadger: The ShortcutBadger makes your Android App show the count of unread messages as a badge on your App shortcut! Supported launchers: Sony

Leo Lin 7.2k Dec 30, 2022
Android Library to build a UI Card

Card Library Travis master: Travis dev: Card Library provides an easy way to display a UI Card using the Official Google CardView in your Android app.

Gabriele Mariotti 4.7k Dec 29, 2022
Android library used to create an awesome Android UI based on a draggable element similar to the last YouTube graphic component.

Draggable Panel DEPRECATED. This project is not maintained anymore. Draggable Panel is an Android library created to build a draggable user interface

Pedro Vicente Gómez Sánchez 3k Dec 6, 2022