工作階段角色與責任,例如

工作階段元件將產品體驗封裝在元件拓撲中。這個程式庫會啟動所有產品專屬元件 (直接或間接) 、管理這些元件的生命週期,以及管理產品專屬元件 (例如面向使用者的應用程式) 和裝置特定元件 (例如輸入裝置、音訊和螢幕,如果有的話) 之間的控制和資訊流程。

以下各節示範工作階段作者如何實作部分相關責任。

顯示元素檢視畫面

在以下範例中,工作階段會透過 ViewSpec 呼叫 PresentView(),將 element 檢視畫面轉送至 GraphicalPresenter ViewSpec 包含重複的 ViewRef (可共用至 Element 檢視畫面的控制代碼),以及一組選用的初始產品專屬 element-annotation

實作「Graphical Presenter」角色的元件知道如何在已連結的螢幕開啟檢視畫面。

    fn present_view_for_element(
        graphical_presenter: &GraphicalPresenterProxy,
        element: &Element
    ) -> Result<ViewControllerProxy, Error> {
        let view_provider = element.connect_to_service::<ViewProviderMarker>()?;
        let token_pair = scenic::ViewTokenPair::new()?;
        let scenic::ViewRefPair {
            mut control_ref,
            mut view_ref
        } = scenic::ViewRefPair::new()?;
        let view_ref_dup = fuchsia_scenic::duplicate_view_ref(&view_ref)?;

        view_provider.create_view_with_view_ref(
            token_pair.view_token.value,
            &mut control_ref,
            &mut view_ref,
        )?;

        let annotations = element.get_annotations()?;

        let view_spec = ViewSpec {
            view_holder_token: Some(token_pair.view_holder_token),
            view_ref: Some(view_ref_dup),
            annotations: Some(annotations),
            ..Default::default()
        };

        let (view_controller_proxy, server_end) = create_proxy::<ViewControllerMarker>()?;
        graphical_presenter.present_view(view_spec, Some(server_end))?;

        Ok(view_controller_proxy)
    }

處理輸入

在以下範例中,如果 MouseHandler 偵測到滑鼠類型的輸入事件,處理常式會將事件傳送至「風景」並傳回空白向量。在所有其他類型的輸入事件中,MouseHandler 會傳迴向量,其中包含用於下一個 InputHandler 處理的 InputEvent

#[async_trait]
impl InputHandler for MouseHandler {
   async fn handle_input_event(
       &mut self,
       input_event: InputEvent,
   ) -> Vec<InputEvent> {
       match input_event {
           InputEvent {
               device_event: InputDeviceEvent::Mouse(mouse_event),
               device_descriptor: InputDeviceDescriptor::Mouse(mouse_descriptor),
           } => {
               // ... Handler specific details
               self.send_events_to_scenic(...)).await;
               vec![] // InputEvent is consumed because it was sent to Scenic
           }
           _ => vec![input_event], // InputEvent is returned for the next InputHandler
       }
   }
}