mirror of https://github.com/buggins/dlangui.git
better animation demo
This commit is contained in:
parent
767e6734cb
commit
c71da5b7fc
Binary file not shown.
After Width: | Height: | Size: 8.2 KiB |
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue