位元詩人 [Solar2D] 程式設計教學:使用 Segmented Control 和 Slider 元件來進行狀態切換

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

[注意事項] Corona 已改名為 Solar2D

本文會展示 segmented control 和 slider 兩種元件。Segmented control 可在數種狀態間切換,概念上類似 Switch,但類別更多。Slider 則可用來做細微的數值調控。我們將範例放在這裡,本文僅節錄部分內容。

程式的示意圖如下:

{{< figure src="/img/corona-sdk/segmented-control-and-slider.png" alt="Solar2D 的 segmented control 和 slider" class="phone" >}}

本範例的元件會調整背景顏色,所以我們把這個功能獨立成一個函式,後續程式就可藉由呼叫此函式來調整背景顏色:

-- Init the parameters related to background color.
local red = 245
local green = 245
local blue = 220
local factor = 1

-- Declare the function to set background color.
local function setBackground(r, g, b, f)
  display.setDefault("background", r * f / 255, g * f / 255, b * f / 255)
end

-- Set initial background color.
setBackground(red, green, blue, factor)

接著,我們撰寫 segmentedControl 物件。這個物件分為三類,分別對應不同顏色的背景。程式會由 target.segmentNumber 來得知目前選擇那一個子項目,程式就會據此改變背景顏色:

-- Declare the listener for Segmented Control object.
local function onSegmentPress(event)
  local target = event.target

  if target.segmentNumber == 1 then
    -- Set RGB color to beige.
    red = 245
    green = 245
    blue = 220
  elseif target.segmentNumber == 2 then
    -- Set RGB color to skyblue.
    red = 135
    green = 206
    blue = 235
  elseif target.segmentNumber == 3 then
    -- Set RGB color lightgreen.
    red = 144
    green = 238
    blue = 144
  end

  setBackground(red, green, blue, factor)
end

-- Init a Segmented Control object.
local segmentedControl = widget.newSegmentedControl(
  {
    x = display.contentCenterX,
    y = display.contentHeight * 0.38,
    segmentWidth = 80,
    segments = { "Beige", "Sky Blue", "Light Green"},
    defaultSegment = 1,
    onPress = onSegmentPress
  }
)

在本範例的 slider 物件中,當 event.value 越大時,factor 會越小,藉此調整背景的亮暗度:

-- Declare the listener for Slider object.
local function sliderListener(event)
  if event.phase == "moved" then
    factor = ((100 - event.value) * 0.2 + 80) / 100
    setBackground(red, green, blue, factor)
  end
end

-- Init a Slider object.
local slider = widget.newSlider(
  {
    x = display.contentCenterX,
    y = display.contentHeight * 0.47,
    width = display.contentWidth * 0.75,
    value = 0,
    listener = sliderListener,
  }
)
關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。