| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- package canvas
- import (
- "image/color"
- "time"
- "fyne.io/fyne/v2"
- )
- const (
- // DurationStandard is the time a standard interface animation will run.
- //
- // Since: 2.0
- DurationStandard = time.Millisecond * 300
- // DurationShort is the time a subtle or small transition should use.
- //
- // Since: 2.0
- DurationShort = time.Millisecond * 150
- )
- // NewColorRGBAAnimation sets up a new animation that will transition from the start to stop Color over
- // the specified Duration. The colour transition will move linearly through the RGB colour space.
- // The content of fn should apply the color values to an object and refresh it.
- // You should call Start() on the returned animation to start it.
- //
- // Since: 2.0
- func NewColorRGBAAnimation(start, stop color.Color, d time.Duration, fn func(color.Color)) *fyne.Animation {
- r1, g1, b1, a1 := start.RGBA()
- r2, g2, b2, a2 := stop.RGBA()
- rStart := int(r1 >> 8)
- gStart := int(g1 >> 8)
- bStart := int(b1 >> 8)
- aStart := int(a1 >> 8)
- rDelta := float32(int(r2>>8) - rStart)
- gDelta := float32(int(g2>>8) - gStart)
- bDelta := float32(int(b2>>8) - bStart)
- aDelta := float32(int(a2>>8) - aStart)
- return &fyne.Animation{
- Duration: d,
- Tick: func(done float32) {
- fn(color.RGBA{R: scaleChannel(rStart, rDelta, done), G: scaleChannel(gStart, gDelta, done),
- B: scaleChannel(bStart, bDelta, done), A: scaleChannel(aStart, aDelta, done)})
- }}
- }
- // NewPositionAnimation sets up a new animation that will transition from the start to stop Position over
- // the specified Duration. The content of fn should apply the position value to an object for the change
- // to be visible. You should call Start() on the returned animation to start it.
- //
- // Since: 2.0
- func NewPositionAnimation(start, stop fyne.Position, d time.Duration, fn func(fyne.Position)) *fyne.Animation {
- xDelta := float32(stop.X - start.X)
- yDelta := float32(stop.Y - start.Y)
- return &fyne.Animation{
- Duration: d,
- Tick: func(done float32) {
- fn(fyne.NewPos(scaleVal(start.X, xDelta, done), scaleVal(start.Y, yDelta, done)))
- }}
- }
- // NewSizeAnimation sets up a new animation that will transition from the start to stop Size over
- // the specified Duration. The content of fn should apply the size value to an object for the change
- // to be visible. You should call Start() on the returned animation to start it.
- //
- // Since: 2.0
- func NewSizeAnimation(start, stop fyne.Size, d time.Duration, fn func(fyne.Size)) *fyne.Animation {
- widthDelta := float32(stop.Width - start.Width)
- heightDelta := float32(stop.Height - start.Height)
- return &fyne.Animation{
- Duration: d,
- Tick: func(done float32) {
- fn(fyne.NewSize(scaleVal(start.Width, widthDelta, done), scaleVal(start.Height, heightDelta, done)))
- }}
- }
- func scaleChannel(start int, diff, done float32) uint8 {
- return uint8(start + int(diff*done))
- }
- func scaleVal(start float32, delta, done float32) float32 {
- return start + delta*done
- }
|