Difference between revisions of "UI Slider"
From GiderosMobile
(created slider page) |
(extended the initial slider example) |
||
Line 1: | Line 1: | ||
__TOC__ | __TOC__ | ||
+ | Here you will find various resources to help you create sliders in Gideros Studio. | ||
− | + | '''note''':You may have to provide your own assets (fonts, gfx, …) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | === Slider === | ||
<source lang="lua"> | <source lang="lua"> | ||
-- UI Slider class | -- UI Slider class | ||
Line 83: | Line 77: | ||
--slider:setValue(75) | --slider:setValue(75) | ||
</source> | </source> | ||
− | < | + | |
+ | === Slider 2 === | ||
+ | <source lang="lua"> | ||
+ | Slider2 = Core.class(Sprite) | ||
+ | |||
+ | function Slider2:init(xparams) | ||
+ | local params = xparams or {} | ||
+ | params.maximum = xparams.maximum or 100 | ||
+ | params.slitcolor = xparams.slitcolor or 0x0 | ||
+ | params.slitalpha = xparams.slitalpha or 1 | ||
+ | params.slitw = xparams.slitw or 64 | ||
+ | params.slith = xparams.slith or 64 | ||
+ | params.knobcolor = xparams.knobcolor or 0xffffff | ||
+ | params.knobalpha = xparams.knobalpha or 1 | ||
+ | params.knobw = xparams.knobw or 32 | ||
+ | params.knobh = xparams.knobh or 32 | ||
+ | -- | ||
+ | local slit = Pixel.new(params.slitcolor, params.slitalpha, params.slitw, params.slith) | ||
+ | slit:setAnchorPoint(0, 0.5) | ||
+ | local knob = Pixel.new(params.knobcolor, params.knobalpha, params.knobw, params.knobh) | ||
+ | knob:setAnchorPoint(0.5, 0.5) | ||
+ | -- | ||
+ | self.width = slit:getWidth() | ||
+ | self:addChild(slit) | ||
+ | self.knob = knob | ||
+ | self:addChild(self.knob) | ||
+ | -- | ||
+ | self.maximum = params.maximum | ||
+ | self.steps = 100 / self.maximum | ||
+ | self.value = 0 | ||
+ | self.isFocus = false | ||
+ | -- | ||
+ | self:addEventListener(Event.MOUSE_DOWN, self.onMouseDown, self) | ||
+ | self:addEventListener(Event.MOUSE_MOVE, self.onMouseMove, self) | ||
+ | self:addEventListener(Event.MOUSE_UP, self.onMouseUp, self) | ||
+ | end | ||
+ | |||
+ | function Slider2:onMouseDown(event) | ||
+ | if self.knob:hitTestPoint(event.x, event.y) then | ||
+ | self.isFocus = true | ||
+ | self.x0 = event.x | ||
+ | event:stopPropagation() | ||
+ | end | ||
+ | end | ||
+ | |||
+ | function Slider2:onMouseMove(event) | ||
+ | if self.isFocus then | ||
+ | local dx = event.x - self.x0 | ||
+ | self.knob:setX(self.knob:getX() + dx) | ||
+ | self.x0 = event.x | ||
+ | |||
+ | -- keep the knob position within its range | ||
+ | if self.knob:getX() < 0 then self.knob:setX(0) end | ||
+ | if self.knob:getX() > self.width then self.knob:setX(self.width) end | ||
+ | self.value = self.maximum * self.knob:getX() / self.width // 1 | ||
+ | |||
+ | local event = Event.new("value_changed") | ||
+ | event.value = self.value | ||
+ | self:dispatchEvent(event) | ||
+ | |||
+ | event:stopPropagation() | ||
+ | end | ||
+ | end | ||
+ | |||
+ | function Slider2:onMouseUp(event) | ||
+ | if self.isFocus then | ||
+ | self.isFocus = false | ||
+ | |||
+ | local event = Event.new("value_changed") | ||
+ | event.value = self.value | ||
+ | self:dispatchEvent(event) | ||
+ | |||
+ | event:stopPropagation() | ||
+ | end | ||
+ | end | ||
+ | |||
+ | function Slider2:setValue(value) | ||
+ | local value = math.floor(value) | ||
+ | -- check within a range of [0, 100] | ||
+ | if value < 0 then value = 0 end | ||
+ | if value > 100 then value = 100 end | ||
+ | posX = self.width * value / 100 * self.steps | ||
+ | self.knob:setPosition(posX, 0) | ||
+ | self.value = value | ||
+ | end | ||
+ | |||
+ | --[[ | ||
+ | ---- usage | ||
+ | -- bg | ||
+ | application:setBackgroundColor(0x333333) | ||
+ | -- a volume slider | ||
+ | local volumeslider = Slider2.new({ | ||
+ | maximum=200, | ||
+ | slitcolor=0x222222, slitalpha=1, slitw=512 - 64 * 2, slith=32, | ||
+ | knobcolor=0x00ffff, knobalpha=1, knobw=40, knobh=48, | ||
+ | }) | ||
+ | volumeslider:setValue(33) | ||
+ | tfsfxvolume = TextField.new(nil, "VOLUME: "..volumeslider.value) | ||
+ | tfsfxvolume:setScale(4) | ||
+ | tfsfxvolume:setTextColor(0xffffff) | ||
+ | -- positions | ||
+ | tfsfxvolume:setPosition(64, 128) | ||
+ | volumeslider:setPosition(64, 196) | ||
+ | -- order | ||
+ | stage:addChild(tfsfxvolume) | ||
+ | stage:addChild(volumeslider) | ||
+ | -- listeners | ||
+ | function onVolumeValueChanging(e) tfsfxvolume:setText("VOLUME: "..e.value) end | ||
+ | function onVolumeValueChanged(e) | ||
+ | tfsfxvolume:setText("VOLUME: "..e.value) | ||
+ | g_sfxvolume = e.value | ||
+ | end | ||
+ | volumeslider:addEventListener("value_changed", onVolumeValueChanged) | ||
+ | volumeslider:addEventListener("value_changed", onVolumeValueChanging) | ||
+ | ]] | ||
+ | </source> |
Revision as of 05:07, 28 August 2021
Here you will find various resources to help you create sliders in Gideros Studio.
note:You may have to provide your own assets (fonts, gfx, …)
Slider
-- UI Slider class
Slider = Core.class(Sprite)
function Slider:init(slit, knob)
self.slit = slit
self.width = self.slit:getWidth()
self:addChild(self.slit)
self.knob = knob
self:addChild(self.knob)
self.value = 0
self.isFocus = false
self:addEventListener(Event.MOUSE_DOWN, self.onMouseDown, self)
self:addEventListener(Event.MOUSE_MOVE, self.onMouseMove, self)
self:addEventListener(Event.MOUSE_UP, self.onMouseUp, self)
end
function Slider:onMouseDown(event)
if self.knob:hitTestPoint(event.x, event.y) then
self.isFocus = true
self.x0 = event.x
event:stopPropagation()
end
end
function Slider:onMouseMove(event)
if self.isFocus then
local dx = event.x - self.x0
self.knob:setX(self.knob:getX() + dx)
self.x0 = event.x
-- keep the knob position within its range
if self.knob:getX() < 0 then self.knob:setX(0) end
if self.knob:getX() > self.width then self.knob:setX(self.width) end
self.value = math.floor(100 * self.knob:getX() / self.width)
event:stopPropagation()
end
end
function Slider:onMouseUp(event)
if self.isFocus then
self.isFocus = false
event:stopPropagation()
end
end
function Slider:setValue(value)
local value = math.floor(value)
-- check within a range of [0, 100]
if value < 0 then value = 0 end
if value > 100 then value = 100 end
posX = self.width * value / 100
self.knob:setPosition(posX, 0)
self.value = value
end
function Slider:getValue()
return self.value
end
---- USAGE
--local slit = Bitmap.new(Texture.new("Images/slit.png"))
--slit:setAnchorPoint(0, 0.5)
--local knob = Bitmap.new(Texture.new("Images/knob.png"))
--knob:setAnchorPoint(0.5, 0.5)
--local myslider = Slider.new(slit, knob)
--stage:addChild(myslider)
--slider:setValue(75)
Slider 2
Slider2 = Core.class(Sprite)
function Slider2:init(xparams)
local params = xparams or {}
params.maximum = xparams.maximum or 100
params.slitcolor = xparams.slitcolor or 0x0
params.slitalpha = xparams.slitalpha or 1
params.slitw = xparams.slitw or 64
params.slith = xparams.slith or 64
params.knobcolor = xparams.knobcolor or 0xffffff
params.knobalpha = xparams.knobalpha or 1
params.knobw = xparams.knobw or 32
params.knobh = xparams.knobh or 32
--
local slit = Pixel.new(params.slitcolor, params.slitalpha, params.slitw, params.slith)
slit:setAnchorPoint(0, 0.5)
local knob = Pixel.new(params.knobcolor, params.knobalpha, params.knobw, params.knobh)
knob:setAnchorPoint(0.5, 0.5)
--
self.width = slit:getWidth()
self:addChild(slit)
self.knob = knob
self:addChild(self.knob)
--
self.maximum = params.maximum
self.steps = 100 / self.maximum
self.value = 0
self.isFocus = false
--
self:addEventListener(Event.MOUSE_DOWN, self.onMouseDown, self)
self:addEventListener(Event.MOUSE_MOVE, self.onMouseMove, self)
self:addEventListener(Event.MOUSE_UP, self.onMouseUp, self)
end
function Slider2:onMouseDown(event)
if self.knob:hitTestPoint(event.x, event.y) then
self.isFocus = true
self.x0 = event.x
event:stopPropagation()
end
end
function Slider2:onMouseMove(event)
if self.isFocus then
local dx = event.x - self.x0
self.knob:setX(self.knob:getX() + dx)
self.x0 = event.x
-- keep the knob position within its range
if self.knob:getX() < 0 then self.knob:setX(0) end
if self.knob:getX() > self.width then self.knob:setX(self.width) end
self.value = self.maximum * self.knob:getX() / self.width // 1
local event = Event.new("value_changed")
event.value = self.value
self:dispatchEvent(event)
event:stopPropagation()
end
end
function Slider2:onMouseUp(event)
if self.isFocus then
self.isFocus = false
local event = Event.new("value_changed")
event.value = self.value
self:dispatchEvent(event)
event:stopPropagation()
end
end
function Slider2:setValue(value)
local value = math.floor(value)
-- check within a range of [0, 100]
if value < 0 then value = 0 end
if value > 100 then value = 100 end
posX = self.width * value / 100 * self.steps
self.knob:setPosition(posX, 0)
self.value = value
end
--[[
---- usage
-- bg
application:setBackgroundColor(0x333333)
-- a volume slider
local volumeslider = Slider2.new({
maximum=200,
slitcolor=0x222222, slitalpha=1, slitw=512 - 64 * 2, slith=32,
knobcolor=0x00ffff, knobalpha=1, knobw=40, knobh=48,
})
volumeslider:setValue(33)
tfsfxvolume = TextField.new(nil, "VOLUME: "..volumeslider.value)
tfsfxvolume:setScale(4)
tfsfxvolume:setTextColor(0xffffff)
-- positions
tfsfxvolume:setPosition(64, 128)
volumeslider:setPosition(64, 196)
-- order
stage:addChild(tfsfxvolume)
stage:addChild(volumeslider)
-- listeners
function onVolumeValueChanging(e) tfsfxvolume:setText("VOLUME: "..e.value) end
function onVolumeValueChanged(e)
tfsfxvolume:setText("VOLUME: "..e.value)
g_sfxvolume = e.value
end
volumeslider:addEventListener("value_changed", onVolumeValueChanged)
volumeslider:addEventListener("value_changed", onVolumeValueChanging)
]]