@@ -1243,6 +1243,23 @@ void ScrollViewComponentView::StartBringIntoView(
12431243 }
12441244}
12451245
1246+ facebook::react::ScrollViewEventEmitter::Metrics ScrollViewComponentView::getScrollMetrics (
1247+ facebook::react::SharedViewEventEmitter const &eventEmitter,
1248+ winrt::Microsoft::ReactNative::Composition::Experimental::IScrollPositionChangedArgs const &args) noexcept {
1249+ facebook::react::ScrollViewEventEmitter::Metrics scrollMetrics{};
1250+ if (eventEmitter) {
1251+ scrollMetrics.containerSize .height = m_layoutMetrics.frame .size .height ;
1252+ scrollMetrics.containerSize .width = m_layoutMetrics.frame .size .width ;
1253+ scrollMetrics.contentOffset .x = args.Position ().x / m_layoutMetrics.pointScaleFactor ;
1254+ scrollMetrics.contentOffset .y = args.Position ().y / m_layoutMetrics.pointScaleFactor ;
1255+ scrollMetrics.zoomScale = 1.0 ;
1256+ scrollMetrics.contentSize .height = std::max (m_contentSize.height , m_layoutMetrics.frame .size .height );
1257+ scrollMetrics.contentSize .width = std::max (m_contentSize.width , m_layoutMetrics.frame .size .width );
1258+ }
1259+
1260+ return scrollMetrics;
1261+ }
1262+
12461263winrt::Microsoft::ReactNative::Composition::Experimental::IVisual ScrollViewComponentView::createVisual () noexcept {
12471264 auto visual = m_compContext.CreateSpriteVisual ();
12481265 m_scrollVisual = m_compContext.CreateScrollerVisual ();
@@ -1264,14 +1281,7 @@ winrt::Microsoft::ReactNative::Composition::Experimental::IVisual ScrollViewComp
12641281 updateStateWithContentOffset ();
12651282 auto eventEmitter = GetEventEmitter ();
12661283 if (eventEmitter) {
1267- facebook::react::ScrollViewEventEmitter::Metrics scrollMetrics;
1268- scrollMetrics.containerSize .height = m_layoutMetrics.frame .size .height ;
1269- scrollMetrics.containerSize .width = m_layoutMetrics.frame .size .width ;
1270- scrollMetrics.contentOffset .x = args.Position ().x / m_layoutMetrics.pointScaleFactor ;
1271- scrollMetrics.contentOffset .y = args.Position ().y / m_layoutMetrics.pointScaleFactor ;
1272- scrollMetrics.zoomScale = 1.0 ;
1273- scrollMetrics.contentSize .height = std::max (m_contentSize.height , m_layoutMetrics.frame .size .height );
1274- scrollMetrics.contentSize .width = std::max (m_contentSize.width , m_layoutMetrics.frame .size .width );
1284+ auto scrollMetrics = getScrollMetrics (eventEmitter, args);
12751285 std::static_pointer_cast<facebook::react::ScrollViewEventEmitter const >(eventEmitter)
12761286 ->onScroll (scrollMetrics);
12771287 m_lastScrollEventTime = now;
@@ -1289,19 +1299,26 @@ winrt::Microsoft::ReactNative::Composition::Experimental::IVisual ScrollViewComp
12891299 updateStateWithContentOffset ();
12901300 auto eventEmitter = GetEventEmitter ();
12911301 if (eventEmitter) {
1292- facebook::react::ScrollViewEventEmitter::Metrics scrollMetrics;
1293- scrollMetrics.containerSize .height = m_layoutMetrics.frame .size .height ;
1294- scrollMetrics.containerSize .width = m_layoutMetrics.frame .size .width ;
1295- scrollMetrics.contentOffset .x = args.Position ().x / m_layoutMetrics.pointScaleFactor ;
1296- scrollMetrics.contentOffset .y = args.Position ().y / m_layoutMetrics.pointScaleFactor ;
1297- scrollMetrics.zoomScale = 1.0 ;
1298- scrollMetrics.contentSize .height = std::max (m_contentSize.height , m_layoutMetrics.frame .size .height );
1299- scrollMetrics.contentSize .width = std::max (m_contentSize.width , m_layoutMetrics.frame .size .width );
1302+ auto scrollMetrics = getScrollMetrics (eventEmitter, args);
13001303 std::static_pointer_cast<facebook::react::ScrollViewEventEmitter const >(eventEmitter)
13011304 ->onScrollBeginDrag (scrollMetrics);
13021305 }
13031306 });
13041307
1308+ m_scrollEndDragRevoker = m_scrollVisual.ScrollEndDrag (
1309+ winrt::auto_revoke,
1310+ [this ](
1311+ winrt::IInspectable const & /* sender*/ ,
1312+ winrt::Microsoft::ReactNative::Composition::Experimental::IScrollPositionChangedArgs const &args) {
1313+ updateStateWithContentOffset ();
1314+ auto eventEmitter = GetEventEmitter ();
1315+ if (eventEmitter) {
1316+ auto scrollMetrics = getScrollMetrics (eventEmitter, args);
1317+ std::static_pointer_cast<facebook::react::ScrollViewEventEmitter const >(eventEmitter)
1318+ ->onScrollEndDrag (scrollMetrics);
1319+ }
1320+ });
1321+
13051322 return visual;
13061323}
13071324
0 commit comments