Android framework for performant generative animations
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Fish 117fc50fb9 couple of minor tweaks 2 years ago
.idea refactor and more primitives 2 years ago
app couple of minor tweaks 2 years ago
gradle/wrapper först commit 2 years ago
skisslib add primitive translate syntax 2 years ago
.gitignore först commit 2 years ago
LICENSE Initial commit 2 years ago add note on pixel based sketches 2 years ago
build.gradle först commit 2 years ago först commit 2 years ago
gradlew först commit 2 years ago
gradlew.bat först commit 2 years ago
settings.gradle först commit 2 years ago


Skiss (Swedish: Sketch): an extremely basic 2D animation system for Android.

It's little more than a game loop, but it's very fast and lightweight and has a structure and syntax influenced by Processing.


Add a SkissView to your layout:

    android:layout_height="match_parent" />

Create a subclass of Skiss (see example below), pass in the view and start from your Activity/Fragment:



There are a few convenience methods (eg. fill, line, circle etc) but the standard View Canvas is also available:

package oppen.skiss.example

import oppen.skiss.lib.Skiss
import oppen.skiss.lib.SkissView
import oppen.skiss.lib.color
import oppen.skiss.lib.random

class DemoSkiss(view: SkissView): Skiss(view) {

    private val background = color("#1d1d1d")
    private val red = color("#ff0000")
    private val pale = color("#55ffffff")
    private var y = 0f

    override fun setup(width: Int, height: Int) {}

    override fun update(canvas: Canvas) {

        y += 2
        if (y > height) y = 0f

        line(0f, y, width.toFloat(), y)

        repeat(100) {
            circle(random(width), random(height), random(5, 40))



Anti-aliasing is off by default, screens on modern devices are so high resolution it may not be needed at all. Skiss uses the same beginner-friendly naming as Processing, turn anti-aliasing on in setup:

override fun setup(width: Int, height: Int) {


Stroke is used for lines, points, and shape borders. Supply a colour int for Skiss to draw with: stroke(aColour). Be sure to pre calculate the colour value and assign to a field, avoid any allocations in the update block. Turn off stroke drawing with noStroke()


Same as stroke above but for shape fills, eg:

circle(100, 100, 20)

Off-screen buffer

Modern phone screens have a lot of pixels, if you're doing anything pixel based it'd be best to use a small offscreen buffer canvas. See the Meta-gravity demo for an example.

Development References