From c71da5b7fc736213a3dc62a7d2c7c42a93c5afda Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Tue, 20 May 2014 17:03:55 +0400 Subject: [PATCH] better animation demo --- examples/example1/res/mdpi/cr3_logo.png | Bin 0 -> 8433 bytes examples/example1/src/main.d | 80 +++++++++++++++++------- src/dlangui/widgets/widget.d | 8 +-- 3 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 examples/example1/res/mdpi/cr3_logo.png diff --git a/examples/example1/res/mdpi/cr3_logo.png b/examples/example1/res/mdpi/cr3_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0d94ea246c86dcc40b8b8495f39b55c65918c6 GIT binary patch literal 8433 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 T;=!W_00000NkvXXu0mjfkMScx literal 0 HcmV?d00001 diff --git a/examples/example1/src/main.d b/examples/example1/src/main.d index ee9c5c37..9e14567f 100644 --- a/examples/example1/src/main.d +++ b/examples/example1/src/main.d @@ -24,18 +24,10 @@ Widget createAboutWidget() return res; } -class SampleAnimationWidget : Widget { - ulong animationProgress; - this(string ID) { - super(ID); - backgroundImageId = "tx_fabric.tiled"; // tx_fabric.jpg tiled - } - /// returns true is widget is being animated - need to call animate() and redraw - @property override bool animating() { return true; } - /// animates window; interval is time left from previous draw, in hnsecs (1/10000000 of second) - override void animate(long interval) { - animationProgress += interval; - invalidate(); +class AnimatedDrawable : Drawable { + DrawableRef background; + this() { + background = drawableCache.get("tx_fabric.tiled"); } void drawAnimatedRect(DrawBuf buf, uint p, Rect rc, int speedx, int speedy, int sz) { int x = (p * speedx % rc.width); @@ -51,23 +43,65 @@ class SampleAnimationWidget : Widget { uint color = (a << 24) | (r << 16) | (g << 8) | b; buf.fillRect(Rect(rc.left + x, rc.top + y, rc.left + x + sz, rc.top + y + sz), color); } - /// Draw widget at its position to buffer - override void onDraw(DrawBuf buf) { - if (visibility != Visibility.Visible) - return; - super.onDraw(buf); - Rect rc = _pos; - applyMargins(rc); - auto saver = ClipRectSaver(buf, rc, alpha); - applyPadding(rc); + void drawAnimatedIcon(DrawBuf buf, uint p, Rect rc, int speedx, int speedy, string resourceId) { + int x = (p * speedx % rc.width); + int y = (p * speedy % rc.height); + if (x < 0) + x += rc.width; + if (y < 0) + y += rc.height; + DrawBufRef image = drawableCache.getImage(resourceId); + buf.drawImage(x, y, image.get); + } + override void drawTo(DrawBuf buf, Rect rc, uint state = 0, int tilex0 = 0, int tiley0 = 0) { + background.drawTo(buf, rc, state, cast(int)(animationProgress / 695430), cast(int)(animationProgress / 1500000)); drawAnimatedRect(buf, cast(uint)(animationProgress / 295430), rc, 2, 3, 100); drawAnimatedRect(buf, cast(uint)(animationProgress / 312400) + 100, rc, 3, 2, 130); - drawAnimatedRect(buf, cast(uint)(animationProgress / 212400) + 200, rc, -2, 1, 290); + drawAnimatedIcon(buf, cast(uint)(animationProgress / 212400) + 200, rc, -2, 1, "dlangui-logo1"); drawAnimatedRect(buf, cast(uint)(animationProgress / 512400) + 300, rc, 2, -2, 200); drawAnimatedRect(buf, cast(uint)(animationProgress / 214230) + 800, rc, 1, 2, 390); - drawAnimatedRect(buf, cast(uint)(animationProgress / 123320) + 900, rc, -1, -3, 150); + drawAnimatedIcon(buf, cast(uint)(animationProgress / 123320) + 900, rc, 1, 2, "cr3_logo"); drawAnimatedRect(buf, cast(uint)(animationProgress / 100000) + 100, rc, -1, -1, 120); } + @property override int width() { + return 1; + } + @property override int height() { + return 1; + } + ulong animationProgress; + void animate(long interval) { + animationProgress += interval; + } + +} + +class SampleAnimationWidget : VerticalLayout { + AnimatedDrawable drawable; + DrawableRef drawableRef; + this(string ID) { + super(ID); + drawable = new AnimatedDrawable(); + drawableRef = drawable; + padding = Rect(20, 20, 20, 20); + addChild(new TextWidget(null, "This is TextWidget on top of animated background"d)); + addChild(new EditLine(null, "This is EditLine on top of animated background"d)); + addChild(new Button(null, "This is Button on top of animated background"d)); + addChild(new VSpacer()); + } + + /// background drawable + @property override DrawableRef backgroundDrawable() const { + return (cast(SampleAnimationWidget)this).drawableRef; + } + + /// returns true is widget is being animated - need to call animate() and redraw + @property override bool animating() { return true; } + /// animates window; interval is time left from previous draw, in hnsecs (1/10000000 of second) + override void animate(long interval) { + drawable.animate(interval); + invalidate(); + } } Widget createEditorSettingsControl(EditWidgetBase editor) { diff --git a/src/dlangui/widgets/widget.d b/src/dlangui/widgets/widget.d index f3686987..05028209 100644 --- a/src/dlangui/widgets/widget.d +++ b/src/dlangui/widgets/widget.d @@ -302,9 +302,9 @@ class Widget { @property Rect padding() const { // get max padding from style padding and background drawable padding Rect p = style.padding; - DrawableRef d = style.backgroundDrawable; + DrawableRef d = backgroundDrawable; if (!d.isNull) { - Rect dp = style.backgroundDrawable.padding; + Rect dp = d.padding; if (p.left < dp.left) p.left = dp.left; if (p.right < dp.right) @@ -344,7 +344,7 @@ class Widget { /// background drawable @property DrawableRef backgroundDrawable() const { - return style.backgroundDrawable; + return stateStyle.backgroundDrawable; } /// widget drawing alpha value (0=opaque .. 255=transparent) @@ -1058,7 +1058,7 @@ class Widget { Rect rc = _pos; applyMargins(rc); auto saver = ClipRectSaver(buf, rc, alpha); - DrawableRef bg = stateStyle.backgroundDrawable; + DrawableRef bg = backgroundDrawable; if (!bg.isNull) { bg.drawTo(buf, rc, state); }