概述

#

在註解搜尋中,AnnotatedRegionLayers 返回的區域性座標已更改為相對於裁剪區域,而不是圖層。這使得區域性座標更有意義和更可靠,但會破壞直接執行註解搜尋並使用區域性座標的程式碼。

背景

#

註解是在渲染階段分配給螢幕區域的元資料。透過位置搜尋註解可以獲得包含該位置的上下文資訊。它們用於檢測滑鼠事件和應用程式欄的主題。

localPosition 最初新增到搜尋結果時,它被定義為相對於擁有註解的圖層,結果證明這是一個設計錯誤。與圖層的偏移量沒有意義且不可靠。例如,如果變換矩陣只是一個簡單的平移,Transform widget 會在同一個圖層上繪製並帶有偏移量;如果矩陣不是平凡的,它會推送一個專用的 TransformLayer。前一種情況保留了先前的座標原點(例如,應用程式的左上角),而後一種情況移動了位置原點,因為它在一個新圖層上。這兩種情況可能不會產生明顯的視覺差異,因為額外的圖層可能只是縮小了 99%,儘管註解搜尋會返回不同的結果。為了使此區域性座標可靠,我們必須選擇其中一個結果來堅持。

變更說明

#

AnnotatedRegionLayer 返回的 localPosition 現在是它收到的區域性位置減去 offset,其中 offset 是裁剪區域相對於圖層的位置。

dart
class AnnotatedRegionLayer<T> extends ContainerLayer {
  @override
  bool findAnnotations<S>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
    ...
    if (/* shouldAddAnnotation */) {
      result.add(AnnotationEntry<S>(
        annotation: typedValue,
        // Used to be:
        // localPosition: localPosition,
        localPosition: localPosition - offset,
      ));
    }
    ...
  }
}

概念上,這改變了 AnnotatedRegionLayer.offsetsize 的定義方式。它們以前的意思是“限制註解搜尋的裁剪矩形”,而現在它們共同表示“註解物件所處的區域”。

遷移指南

#

積極使用此區域性座標的程式碼很可能直接與圖層互動,因為使用渲染物件或 widget 已經使此結果不可靠。為了保留之前的行為,您可以重新實現 AnnotatedRegionLayer 以返回不減去偏移量的區域性座標。

時間線

#

登陸版本:1.15.2
穩定版本: 1.17

參考資料

#

API 文件

相關問題

相關 PR