Touch ToggleButton

Touch ScrollView¿¡¼­ »ç¿ëÇϱâ À§ÇØ Touch ToggleButtonÀ» ¸¸µé¾î º¸ÀÚ.
ÅÍÄ¡ ½ºÅ©¸°Àº ¸¶¿ì½º À̺¥Æ®¿Í´Â ´Ù¸¥ À̺¥Æ®¸¦ »ç¿ëÇϱ⠶§¹®¿¡ Ãß°¡ 󸮰¡ ÇÊ¿äÇÏ´Ù.
ÅÍÄ¡ À̺¥Æ®¸¦ ó¸®ÇÏ´Â Touch ToggleButtonÀ» ¸¸µé¾î º¸ÀÚ.

TouchToggleButtonÀº Ŭ¸¯ À̺¥Æ®¸¸ ó¸®ÇÏ°í ºñÁÖ¾óÀº ÂüÁ¶ÇÏ´Â CheckBox·Î ó¸® ÇÑ´Ù.
TouchToggleButtonÀÇ ºñÁÖ¾óÀº ¼û±ä´Ù.

TouchToggleButton »ç¿ë¹ý

TouchToggleButtonÀ» »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æ º»´Ù.

TouchToggleButton ÆÄÀÏ º¹»ç

TouchToggleButton.h
TouchToggleButton.cpp

ÆÄÀÏÀ» º¹»çÇÏ¸é ´ÙÀ½ÀÇ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.
error C2079: 'UTouchScrollWidget'Àº(´Â) Á¤ÀǵÇÁö ¾ÊÀº class 'UI_TEST_API'À»(¸¦) »ç¿ëÇÕ´Ï´Ù.

Çì´õ ÆÄÀÏ TouchScrollWidget.h, TouchToggleButton.h ÆÄÀÏ¿¡¼­ UI_TEST_API¸¦ UMGDEMO_API·Î º¯°æÇÑ´Ù.

TouchToggleButton UI ¸®¼Ò½º Ãß°¡

TouchToggleButton Ŭ·¡½º¸¦ Ãß°¡ ÈÄ ÄÄÆÄÀÏ ÇÏ¸é ¾Æ·¡ ±×¸²°ú °°ÀÌ "ÀϹÝ"¿¡ Ãß°¡ µÈ´Ù.

TouchToggleBox¸¦ Ãß°¡ÇÏ°í À̸§Àº TouchToggleButton_Test·Î ÇÑ´Ù.
CheckBox¸¦ Ãß°¡ÇÏ°í À̸§Àº CheckBox_Toggle·Î ÇÑ´Ù.



TouchToggleButton_Test¸¦ ÁöÁ¤ÇÏ°í µðÅ×ÀÏ Æгο¡¼­ CheckBox¸¦ ÁöÁ¤ÇÑ´Ù.




CheckBox_Toggle¿¡¼­ ´ÙÀ½ »çÇ×À» ¼³Á¤ÇÑ´Ù.

üũ ¹Ú½º Å×½ºÆ®¸¦ À§ÇØ Check Box TypeÀ» "Toggle Button"À¸·Î ÁöÁ¤ÇÑ´Ù.
Unchecked Image¸¦ "Box"·Î ¼³Á¤ÇÑ´Ù.
Checked Image¸¦ "Box"·Î ¼³Á¤ÇÏ°í Ä®¶ó¸¦ ¼öÁ¤ÇÑ´Ù.




Visibility¸¦ "Not Hit-Testable (Select & All Children)À¸·Î ¼³Á¤ ÇÑ´Ù.
Toggle Button¿¡¼­ CheckBox¸¦ ¼±ÅÃÇÏ´Â ¼ø°£ ¾Æ·¡ ¿É¼ÇÀº ÀÚµ¿À¸·Î ¼³Á¤µÈ´Ù.
±×·¯´Ï º°µµ·Î ¼³Á¤ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.




Ŭ¸¯½Ã ¹öÆ° À̺¥Æ® ó¸®

¹öÆ°ÀÌ Å¬¸¯ µÇ¸é ´ÙÀ̳ª¹Í ¸ÖƼij½ºÆ®·Î OnClickTouchButton·Î Broadcast¸¦ ÇÑ´Ù.

OnClickTouchButton.Broadcast(this);

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FClickTouchButton, UWidget*, Widget);

class UMGDEMO_API UTouchToggleButton : public UButton
{
    .....
public:
    FClickTouchButton OnClickTouchButton;
    .....
};


touchToggleButton->OnClickTouchButton.AddDynamic(this, &UTouchScrollWidget::OnClickListItem);


³»ºÎ ÄÚµå ºÐ¼®

¹öÆ°ÀÇ Touch¿Í Drag(³ªÁß¿¡ ScrollView¿¡¼­ µå·¡±× Çϱâ À§ÇØ)¸¦ Áö¿øÇϱâ À§ÇØ µðÅ×ÀÏ ÆгÎÀÇ ¿É¼ÇÀ» ´ÙÀ½°ú °°ÀÌ º¯°æÇÑ´Ù.

Click Method¸¦ "Precise Click"
Touch Method¸¦ "Precise Tap"



´ÙÀ½ ÄÚµå·Î ó¸® ÇÑ´Ù.
    ClickMethod = EButtonClickMethod::PreciseClick;
    TouchMethod = EButtonTouchMethod::PreciseTap;

¹öÆ°À» ¼û±â±â À§ÇØ DrawAs¸¦ ESlateBrushDrawType::NoDrawTypeÀ¸·Î ¼³Á¤ ÇÑ´Ù.
    WidgetStyle.Normal.DrawAs = ESlateBrushDrawType::NoDrawType;
    WidgetStyle.Hovered.DrawAs = ESlateBrushDrawType::NoDrawType;
    WidgetStyle.Pressed.DrawAs = ESlateBrushDrawType::NoDrawType;
    WidgetStyle.Disabled.DrawAs = ESlateBrushDrawType::NoDrawType;

ÂüÁ¶µÈ üũ¹Ú½º(MyCheckBox)´Â Ŭ¸¯½Ã À̺¥Æ®¸¦ ¹ÞÁö ¾Êµµ·Ï ¼³Á¤ÇÑ´Ù.
MyCheckBox->SetVisibility(ESlateVisibility::HitTestInvisible);

¿¡µð¿¡¼­ ¼³Á¤ÀÌ ¹Ù²î¸é üũ¹Ú½ºÀÇ ¿É¼ÇÀ» ÀÚµ¿À¸·Î º¯°æÇϱâ À§ÇØ SynchronizeProperties ¸Þ¼Òµå¿¡¼­ ResetCheckButton ÇÔ¼ö¸¦ È£Ãâ ÇÑ´Ù.
void UTouchToggleButton::SynchronizeProperties()
{
    Super::SynchronizeProperties();
    if (IsDoOnce.IsSet() && IsDoOnce)
    {
        ResetCheckButton();
    }
}

TOptional< >À» »ç¿ë ÇÏ¸é °ªÀÌ ÃʱâÈ­ µÇ¾ú´ÂÁö ¾Æ´ÑÁö ó¸® ÇÒ ¼ö ÀÖ´Ù.

TOptional<bool> IsDoOnce;
IsDoOnce = true;

if (IsDoOnce.IsSet() && IsDoOnce)
{
    ResetCheckButton();
}

Æ÷Ä¿½º°¡ ¹öÆ°¿¡ ¾ø´Â °æ¿ì Ŭ¸¯½Ã À̺¥Æ®°¡ µÎ¹ø ¹ß»ý ÇÑ´Ù.
¹öÆ°À» ÇϹø¸¸ ó¸® Çϱâ À§ÇØ °í¼º´É ŸÀÌ¸Ó FPlatformTime::Seconds¸¦ ÀÌ¿ëÇØ Å¬¸¯ À̺¥Æ®¸¦ Çѹø¸¸ ¹Þµµ·Ï ó¸® Çß´Ù.

¹öÆ° Ŭ¸¯½Ã üũ ¹Ú½ºÀÇ Åä±Û ÇÑ´Ù.

void UTouchToggleButton::OnClickButton()
{
    double now = FPlatformTime::Seconds();
    if (now - LastClickTimer < 0.05f)
        return;

    LastClickTimer = now;

    UE_LOG(LogTemp, Log, TEXT("UTouchToggleButton::OnClickButton"));
    if (MyCheckBox)
    {
        if(MyCheckBox->GetCheckedState() == ECheckBoxState::Checked)
            MyCheckBox->SetCheckedState(ECheckBoxState::Unchecked);
        else
            MyCheckBox->SetCheckedState(ECheckBoxState::Checked);
    }

    if (OnClickTouchButton.IsBound())
        OnClickTouchButton.Broadcast(this);
}

ÂüÁ¶)
Basic UI Test Project : tutorial16.html