工作階段元件會在元件拓樸中封裝產品體驗。它會直接或間接啟動所有產品專屬元件、管理這些元件的生命週期,以及管理產品專屬元件 (例如面向使用者的應用程式) 和裝置專屬元件 (例如輸入裝置、音訊和螢幕 (如有)) 之間的控制和資訊流程。
以下各節將說明工作階段作者如何實作部分這些責任。
呈現元素的檢視畫面
在以下範例中,工作階段會透過
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
偵測到滑鼠輸入的輸入事件,處理常式會將事件傳送至 Scenic,並傳回空白向量。在所有其他類型的輸入事件中,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
}
}
}