diff options
| author | Jules Aguillon | 2024-11-18 00:13:08 +0100 |
|---|---|---|
| committer | Jules Aguillon | 2024-11-18 00:13:08 +0100 |
| commit | 997b7be4c005696df91dc1833b4fb4db6c984991 (patch) | |
| tree | 768e9cd16851ad12404a8b7c39d197e35932c3ca /srcs/res | |
| parent | 23097921cfb4e6c86c947ff39438e943bda24f18 (diff) | |
| download | unexpected-keyboard-997b7be4c005696df91dc1833b4fb4db6c984991.tar.gz unexpected-keyboard-997b7be4c005696df91dc1833b4fb4db6c984991.zip | |
launcher: Animated vector describing swipe gesture
Replace the short video with an animated vector image that shows the
swipe gesture.
This is much lighter and reliable than the mp4 video, which failed to
play on many devices.
Source for the image of the key is in inkscape SVG format in srcs/res
and is converted to an android drawable when needed. The swipe animation
is hand-written.
Diffstat (limited to 'srcs/res')
| -rw-r--r-- | srcs/res/SvgToVector.java | 32 | ||||
| -rw-r--r-- | srcs/res/doc_key.svg | 192 | ||||
| -rw-r--r-- | srcs/res/gen_doc_key_drawables.sh | 25 |
3 files changed, 249 insertions, 0 deletions
diff --git a/srcs/res/SvgToVector.java b/srcs/res/SvgToVector.java new file mode 100644 index 0000000..78486fe --- /dev/null +++ b/srcs/res/SvgToVector.java @@ -0,0 +1,32 @@ +package srcs.res; + +import com.android.ide.common.vectordrawable.Svg2Vector; +import java.io.File; +import java.io.FileOutputStream; + +/** Inspired from Bernard Ladenthin's answer: + https://stackoverflow.com/a/78898372 */ +public class SvgToVector +{ + public static void main(String[] args) + { + if (args.length != 2) + { + System.out.println("Usage: svg_to_vector <input_file> <output_file>"); + return; + } + try + { + File input_file = new File(args[0]); + FileOutputStream output_stream = new FileOutputStream(args[1]); + String warnings; + warnings = Svg2Vector.parseSvgToXml(input_file, output_stream); + System.err.println(warnings); + } + catch (Exception e) + { + e.printStackTrace(); + System.exit(2); + } + } +} diff --git a/srcs/res/doc_key.svg b/srcs/res/doc_key.svg new file mode 100644 index 0000000..73e6a2a --- /dev/null +++ b/srcs/res/doc_key.svg @@ -0,0 +1,192 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="35mm" + height="40mm" + viewBox="0 0 35 40" + version="1.1" + id="svg1" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)" + sodipodi:docname="doc_key.svg" + inkscape:export-filename="key_u.svg" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview1" + pagecolor="#1b1b1b" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#1b1b1b" + inkscape:document-units="mm" + inkscape:zoom="4.6038101" + inkscape:cx="160.95364" + inkscape:cy="75.69817" + inkscape:window-width="2560" + inkscape:window-height="1440" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer2"> + <inkscape:page + x="0" + y="0" + width="35" + height="40" + id="page1" + margin="0" + bleed="0" + inkscape:label="g" /> + <inkscape:page + x="45" + y="0" + width="35" + height="40" + id="page2" + margin="0" + bleed="0" + inkscape:label="u" /> + </sodipodi:namedview> + <defs + id="defs1" /> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="U" + style="display:inline"> + <g + inkscape:label="Background" + inkscape:groupmode="layer" + id="layer1" + style="display:inline" + transform="translate(42.916821,-9.9998472)"> + <rect + style="display:inline;fill:#333333;fill-opacity:1;stroke:#404040;stroke-width:0.251;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" + id="rect1" + width="14.749311" + height="19.74971" + x="12.208678" + y="20.125347" + ry="1.1332803" + inkscape:label="rect1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.48996px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#fdfdfd;fill-opacity:1;stroke:none;stroke-width:0.265729;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" + x="59.864403" + y="22.246796" + id="text1" + inkscape:label="text1" + inkscape:transform-center-x="-0.00074323194" + inkscape:transform-center-y="-0.001350474" + transform="scale(1.0003873,0.99961285)"><tspan + id="tspan1" + sodipodi:role="line" + x="59.864403" + y="22.246796" + style="stroke-width:0.265729">u</tspan><tspan + id="tspan2" + sodipodi:role="line" + x="59.864403" + y="32.859245" + style="stroke-width:0.265729" /></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" + x="55.882885" + y="28.802013" + id="text3" + transform="scale(1.0003873,0.99961285)" + inkscape:label="text3"><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729" + x="55.882885" + y="28.802013" + id="tspan4">&</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" + x="65.686905" + y="15.189408" + id="text5" + transform="scale(1.0003873,0.99961285)"><tspan + sodipodi:role="line" + id="tspan5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729" + x="65.686905" + y="15.189408">7</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="G" + style="display:inline"> + <g + inkscape:label="Background" + inkscape:groupmode="layer" + id="g2" + style="display:inline"> + <rect + style="display:inline;fill:#333333;fill-opacity:1;stroke:#404040;stroke-width:0.251;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" + id="rect2" + width="14.749311" + height="19.74971" + x="10.125345" + y="10.125347" + ry="1.1332803" + inkscape:label="rect1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" + x="10.887006" + y="27.77977" + id="text3-3" + transform="scale(1.0003873,0.99961285)" + inkscape:label="text3"><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729" + x="10.887006" + y="27.77977" + id="tspan4-7">_</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.48996px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#fdfdfd;fill-opacity:1;stroke:none;stroke-width:0.265729;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" + x="14.868526" + y="22.204519" + id="text1-2" + inkscape:label="text1" + inkscape:transform-center-x="-0.00074323194" + inkscape:transform-center-y="-0.001350474" + transform="scale(1.0003873,0.99961285)"><tspan + id="tspan1-0" + sodipodi:role="line" + x="14.868526" + y="22.204519" + style="stroke-width:0.265729">g</tspan><tspan + id="tspan2-2" + sodipodi:role="line" + x="14.868526" + y="32.816971" + style="stroke-width:0.265729" /></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;display:inline;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.265728;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" + x="20.691027" + y="15.147132" + id="text5-5" + transform="scale(1.0003873,0.99961285)"><tspan + sodipodi:role="line" + id="tspan5-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.65997px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, @wght=500';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;font-variation-settings:'wght' 500;fill:#cccccc;fill-opacity:1;stroke-width:0.265729" + x="20.691027" + y="15.147132">-</tspan></text> + </g> +</svg> diff --git a/srcs/res/gen_doc_key_drawables.sh b/srcs/res/gen_doc_key_drawables.sh new file mode 100644 index 0000000..ff89793 --- /dev/null +++ b/srcs/res/gen_doc_key_drawables.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +set -e +cd "$(dirname $0)" + +DRAWABLE_DIR=../../res/drawable +ANDROID_LIB=$ANDROID_SDK_ROOT/tools/lib + +first () { echo "$1"; } +JAVA_ARGS=( + -classpath + "$(first $ANDROID_LIB/sdk-common-*.jar):$(first $ANDROID_LIB/common-*.jar)" +) +svg_to_vector () +{ + java "${JAVA_ARGS[@]}" SvgToVector.java "$@" +} + +TMP=`mktemp -d` +trap "rm -r '$TMP'" EXIT +set -x + +inkscape doc_key.svg -o "$TMP/doc_key_u.svg" -C --export-page 2 --export-plain-svg --export-text-to-path + +svg_to_vector "$TMP/doc_key_u.svg" "$DRAWABLE_DIR/doc_key_u.xml" |
