RadialController クラス

定義

Surface Dial などのホイール入力デバイスまたはアクセサリを表します。

Surface Studioとペンで表面ダイヤル。

回転動作 (またはジェスチャ) に基づくフォームファクタを持つ Surface Dial は、プライマリ デバイスからの入力を補完または変更する、セカンダリのマルチ モーダル入力デバイスとして設計されています。 このデバイスは多くの場合、ユーザーが利き手でタスクを実行している間に (たとえばペンでインク操作をするときなど)、利き手ではない手で操作されます。 高精度のポインター入力 (タッチ、ペン、マウスなど) 用に設計されていません。

Surface Dial は、長押しアクションとクリックアクションもサポートしています。 長押しの機能は 1 つで、コマンドのメニューを表示します。 メニューがアクティブになっている場合、回転とクリックの入力はメニューによって処理されます。 それ以外の場合、入力は、処理のためにアプリに渡されます。

RadialController と関連 API (トピックの最後を参照) を使用すると、統合コマンド メニューと、アプリでサポートされている対話エクスペリエンスの両方をカスタマイズできます。

public ref class RadialController sealed
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 196608)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
class RadialController final
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 196608)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
public sealed class RadialController
Public NotInheritable Class RadialController
継承
Object Platform::Object IInspectable RadialController
属性

Windows の要件

デバイス ファミリ
Windows 10 Anniversary Edition (10.0.14393.0 で導入)
API contract
Windows.Foundation.UniversalApiContract (v3.0 で導入)

この例では、Surface Dial メニューにカスタム ツールを追加し、RadialController 入力ハンドラーを宣言します。

  1. まず、CreateForCurrentView を呼び出して、Surface Dial (myController) の RadialController オブジェクトへの参照を作成します。
  2. 次に、RadialControllerMenuItem.CreateFromIcon を呼び出して RadialControllerMenuItem (myItem) のインスタンスを作成します。
  3. 次に、その項目をメニュー項目のコレクションに追加します。
  4. RadialControllerオブジェクトの入力イベント ハンドラー (ButtonClickedRotationChanged) を宣言します。
  5. 最後に、イベント ハンドラーを定義します。
public sealed partial class MainPage : Page
 {
     RadialController myController;

     public MainPage()
     {
         this.InitializeComponent();
         // Create a reference to the RadialController.
         myController = RadialController.CreateForCurrentView();

         // Create an icon for the custom tool.
         RandomAccessStreamReference icon =
           RandomAccessStreamReference.CreateFromUri(
             new Uri("ms-appx:///Assets/StoreLogo.png"));

         // Create a menu item for the custom tool.
         RadialControllerMenuItem myItem =
           RadialControllerMenuItem.CreateFromIcon("Sample", icon);

         // Add the custom tool to the RadialController menu.
         myController.Menu.Items.Add(myItem);

         // Declare input handlers for the RadialController.
         myController.ButtonClicked += MyController_ButtonClicked;
         myController.RotationChanged += MyController_RotationChanged;
     }

     // Handler for rotation input from the RadialController.
     private void MyController_RotationChanged(RadialController sender,
       RadialControllerRotationChangedEventArgs args)
     {
         if (RotationSlider.Value + args.RotationDeltaInDegrees > 100)
         {
             RotationSlider.Value = 100;
             return;
         }
         else if (RotationSlider.Value + args.RotationDeltaInDegrees < 0)
         {
             RotationSlider.Value = 0;
             return;
         }
         RotationSlider.Value += args.RotationDeltaInDegrees;
     }

     // Handler for click input from the RadialController.
     private void MyController_ButtonClicked(RadialController sender,
       RadialControllerButtonClickedEventArgs args)
     {
         ButtonToggle.IsOn = !ButtonToggle.IsOn;
     }
 }

ここで示す初期化関数では、RadialController オブジェクトのさまざまな入力イベント ハンドラーを宣言します。

// Create and configure our radial controller.
private void InitializeController() 
{
    // Create a reference to the RadialController.
    radialController = RadialController.CreateForCurrentView();
    // Set rotation resolution to 1 degree of sensitivity.
    radialController.RotationResolutionInDegrees = 1;

    // Declare input handlers for the RadialController.
    radialController.ButtonClicked += (sender, args) =>
    { RadialController_ButtonClicked(sender, args); };
    radialController.RotationChanged += (sender, args) =>
    { RadialController_RotationChanged(sender, args); };

    radialController.ControlAcquired += (sender, args) =>
    { RadialController_ControlAcquired(sender, args); };
    radialController.ControlLost += (sender, args) =>
    { RadialController_ControlLost(sender, args); };
    radialController.ScreenContactStarted += (sender, args) =>
    { RadialController_ScreenContactStarted(sender, args); };
    radialController.ScreenContactContinued += (sender, args) =>
    { RadialController_ScreenContactContinued(sender, args); };
    radialController.ScreenContactEnded += (sender, args) =>
    { RadialController_ScreenContactEnded(sender, args); };
    AddToLog("Input handlers created");

    // Create the custom menu items.
    CreateMenuItems();
    // Specify the menu items.
    ConfigureMenu();
}

ButtonClicked ハンドラーでは、相互作用によってトグル ボタンの状態がオンまたはオフに設定されます。

// Occurs when the wheel device is pressed and then released 
// while a customRadialController tool is active.
// NOTE: Your app does not receive this event when the RadialController 
// menu is active or a built-in tool is active
// Send click input to toggle button of active region.
private void RadialController_ButtonClicked(RadialController sender,
  RadialControllerButtonClickedEventArgs args)
{
    toggles[activeMenuItemIndex].IsOn = !toggles[activeMenuItemIndex].IsOn;
}

RotationChanged ハンドラーでは、相互作用によってスライダーの値が変更されます。

// Occurs when the wheel device is rotated while a custom 
// RadialController tool is active.
// NOTE: Your app does not receive this event when the RadialController 
// menu is active or a built-in tool is active
// Send rotation input to slider of active region.
private void RadialController_RotationChanged(RadialController sender,
  RadialControllerRotationChangedEventArgs args)
{
    Slider slider = sliders[activeMenuItemIndex];
    if (slider.Value + args.RotationDeltaInDegrees > 100)
    {
        slider.Value = 100;
        return;
    }
    else if (slider.Value + args.RotationDeltaInDegrees < 0)
    {
        slider.Value = 0;
        return;
    }
    slider.Value += args.RotationDeltaInDegrees;
    AddToLog("\nRotation: " + sliders[activeMenuItemIndex].Name + " value changed to " + slider.Value);
}

注釈

バージョン履歴

Windows のバージョン SDK バージョン 追加された値
1703 15063 ButtonHolding
1703 15063 ButtonPressed
1703 15063 ButtonReleased

プロパティ

Menu

RadialController オブジェクトに関連付けられているメニューへの参照を取得します。

RotationResolutionInDegrees

RotationChanged イベントを発生させるために RadialController オブジェクトに必要な最小回転値を取得または設定します。

UseAutomaticHapticFeedback

RadialController によって発生した RotationChanged イベントごとに、ホイール デバイスでハプティクス フィードバックを有効にするかどうかを取得または設定します。

メソッド

CreateForCurrentView()

ホイール デバイスの RadialController オブジェクトをインスタンス化し、アクティブなアプリケーションにバインドします。

IsSupported()

ホイール デバイスがシステムでサポートされているかどうかを示す値を取得します。

イベント

ButtonClicked

カスタム RadialController ツールがアクティブな状態でホイール デバイスが押されて離されたときに発生します。

次の場合、アプリはこのイベントを受け取りません。

  • RadialController メニューがアクティブです
  • 組み込みツールがアクティブである

注意

時間のしきい値を超えると、クリックは長押しアクションになります。 この場合、 RadialController オブジェクトに関連付けられているコンテキスト アプリ コマンドの統合メニューが表示され、その後の回転イベントとクリック イベントがメニューによって処理されます。

ButtonHolding

ユーザーがホイール デバイスを押したままにすると発生します。

ButtonPressed

ホイール デバイスが押されたときに発生します。

ButtonReleased

ホイール デバイスが押されて離されたときに発生します。

ControlAcquired

カスタム RadialController ツール (アプリによって定義) がメニューから選択されている場合、またはカスタム RadialController ツールがアクティブな間に RadialController オブジェクトに関連付けられているアプリがフォアグラウンドに移動されたときに発生します。

ControlLost

カスタム RadialController ツール (アプリによって定義) がアクティブで、 RadialController オブジェクトに関連付けられているアプリがバックグラウンドに送信されるか、ユーザーが RadialController メニューをアクティブ化している間に発生します。

RotationChanged

カスタム RadialController ツールがアクティブな状態でホイール デバイスが回転したときに発生します。

次の場合、アプリはこのイベントを受け取りません。

  • RadialController メニューがアクティブです
  • 組み込みツールがアクティブである
ScreenContactContinued

デジタイザーサーフェスに接触しているときにホイールデバイスが移動され、カスタム RadialController ツールがアクティブな場合にのみ発生します。

次の場合、アプリはこのイベントを受け取りません。

  • RadialController メニューがアクティブです
  • 組み込みツールがアクティブである

ヒント

Surface Dial は、既定の長押しメニュー エクスペリエンスに加えて、Surface Studioの画面上に直接配置することもできます。 これにより、特殊な "オンスクリーン" メニューが実現されます。

Surface Dial の接触位置と境界の両方を検出することで、システムはデバイスによるオクルージョンを処理し、ダイヤルの外側を囲むより大きなバージョンのメニューを表示できます。 この同じ情報をアプリで使用して、デバイスの存在とその予想される使用状況 (ユーザーの手や腕の配置など) の両方に合わせて UI を調整することもできます。

このイベントは ScreenContactStarted の後に発生し、 ScreenContactEnded で停止します。

ScreenContactEnded

デジタイザー サーフェスに接触しているホイール デバイスが削除され (または検出されなくなった)、カスタム RadialController ツールがアクティブな場合に発生します。

次の場合、アプリはこのイベントを受け取りません。

  • RadialController メニューがアクティブです
  • 組み込みツールがアクティブである

ヒント

Surface Dial は、既定の長押しメニュー エクスペリエンスに加えて、Surface Studioの画面上に直接配置することもできます。 これにより、特殊な "オンスクリーン" メニューが実現されます。

Surface Dial の接触位置と境界の両方を検出することで、システムはデバイスによるオクルージョンを処理し、ダイヤルの外側を囲むより大きなバージョンのメニューを表示できます。 この同じ情報をアプリで使用して、デバイスの存在とその予想される使用状況 (ユーザーの手や腕の配置など) の両方に合わせて UI を調整することもできます。

このイベントは、 ScreenContactStarted の後に発生します。

ScreenContactStarted

ホイール デバイスとデジタイザーサーフェスの間で初期接触が検出され、カスタム RadialController ツールがアクティブな場合に発生します。

次の場合、アプリはこのイベントを受け取りません。

  • RadialController メニューがアクティブです
  • 組み込みツールがアクティブである

ヒント

Surface Dial は、既定の長押しメニュー エクスペリエンスに加えて、Surface Studioの画面上に直接配置することもできます。 これにより、特殊な "オンスクリーン" メニューが実現されます。

Surface Dial の接触位置と境界の両方を検出することで、システムはデバイスによるオクルージョンを処理し、ダイヤルの外側を囲むより大きなバージョンのメニューを表示できます。 この同じ情報をアプリで使用して、デバイスの存在とその予想される使用状況 (ユーザーの手や腕の配置など) の両方に合わせて UI を調整することもできます。

適用対象

こちらもご覧ください