一個圖片編輯板,有兩部分組成。編輯板和內容項。每一個內容項是被InteractiveViewer修飾的widget,具有縮放偏移的功能。
在圖片編輯板上, 會有多個內容相,圖片或文字(添加文字目前還沒做過)。 當要編輯其中一個項目時,必然需要先選中這個項目。這就牽扯到事件問題。是不是點中哪個看到的項目,這個項目就會發出事件?實際情況是不會的。因為InteractiveViewer的大小是覆蓋真個編輯板的,雖然看到的內容項小,其實是占用了所有編輯板的。這就導致事件無法傳遞給你看到并點擊的內容項。
這就需要我們重新實現編輯板的事件路由。
1. 我們在InteractiveViewer再修飾一層GestureDetector。這樣就能獲取在編輯板上點擊的所有事件!
2. 實時計算每一個內容項的事件區域,或者說在編輯板所占位置大小,也就是一個Rect對象。這里要注意縮放問題。
if (widget.transformationController != null &&widget.mergeItemInfo.eventArea != null) {double transX = widget.transformationController!.value.getTranslation().x; //the distance in UI review.double transY = widget.transformationController!.value.getTranslation().y;double scale = widget.transformationController!.value.getMaxScaleOnAxis();Rect eventArea = Rect.fromLTWH(widget.mergeItemInfo.initEventArea!.left * scale + transX,widget.mergeItemInfo.initEventArea!.top * scale + transY,widget.mergeItemInfo.initEventArea!.width * scale,widget.mergeItemInfo.initEventArea!.height * scale);widget.mergeItemInfo.eventArea = eventArea;}
3. 根據點擊的事件位置,路由的遍歷每一個內容項,查看是否命中,命中就返回事件給這個內容項。
bool isInEventArea(TapDownDetails details) {Offset point = details.localPosition;if (eventArea != null) {return point.dx >= eventArea!.left &&point.dx <= eventArea!.left + eventArea!.width &&point.dy >= eventArea!.top &&point.dy <= eventArea!.top + eventArea!.height;}return false;}