From 0a5dd9050ef106b1ec218b5cd9285d551d6a6998 Mon Sep 17 00:00:00 2001 From: zengyue ye Date: Wed, 22 Nov 2023 23:32:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B8=B4=E6=97=B6=E4=BF=AE=E5=A4=8D=20d?= =?UTF-8?q?odge=20=E7=9A=84=E5=B9=B3=E7=A7=BB=E9=97=AE=E9=A2=98=20(#1888)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/f2/src/components/geometry/index.tsx | 18 ++- ...3-pan-\344\272\213\344\273\266-1-snap.png" | Bin 0 -> 11568 bytes ...10\235\345\247\213\345\214\226-1-snap.png" | Bin 0 -> 11635 bytes .../test/components/interaction/pan.test.tsx | 133 +++++++++++++++++- 4 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 "packages/f2/test/components/interaction/__image_snapshots__/pan-test-tsx-\345\271\263\347\247\273\345\222\214\347\274\251\346\224\276-\345\271\263\347\247\273\345\222\214\347\274\251\346\224\276-dodge-\347\261\273\345\236\213-pan-\344\272\213\344\273\266-1-snap.png" create mode 100644 "packages/f2/test/components/interaction/__image_snapshots__/pan-test-tsx-\345\271\263\347\247\273\345\222\214\347\274\251\346\224\276-\345\271\263\347\247\273\345\222\214\347\274\251\346\224\276-dodge-\347\261\273\345\236\213-\345\210\235\345\247\213\345\214\226-1-snap.png" diff --git a/packages/f2/src/components/geometry/index.tsx b/packages/f2/src/components/geometry/index.tsx index b176a9295..122922aaa 100644 --- a/packages/f2/src/components/geometry/index.tsx +++ b/packages/f2/src/components/geometry/index.tsx @@ -287,7 +287,7 @@ class Geometry< const scale = scales[i]; if (scale.isCategory) { const field = scale.field; - obj[field] = scale.translate(obj[field]); + obj[field] = scale.translate(obj.origin[field]); } } } @@ -466,7 +466,7 @@ class Geometry< * 如果是Category/Identity 则第一个元素走 mapping */ _mapping(records) { - const { attrs, props, attrController } = this; + const { attrs, props, attrController, adjust } = this; const { coord } = props; const { linearAttrs, nonlinearAttrs } = attrController.getAttrsByLinear(); @@ -500,11 +500,21 @@ class Geometry< for (let k = 0; k < linearAttrs.length; k++) { const attrName = linearAttrs[k]; const attr = attrs[attrName]; + + // TODO: 这块逻辑只是临时方案,需要整体考虑 + let value = child[attr.field]; + // 如果 scale变化,每组偏移需要重新计算 + if (adjust?.type === 'dodge' && attr.field === adjust.adjust.xField) { + value = + attr.scale.translate(child.origin[attr.field]) - + (Math.round(child[attr.field]) - child[attr.field]); + } + // 分类属性的线性映射 if (attrController.isGroupAttr(attrName)) { - attrValues[attrName] = attr.mapping(child[attr.field], child); + attrValues[attrName] = attr.mapping(value, child); } else { - normalized[attrName] = attr.normalize(child[attr.field]); + normalized[attrName] = attr.normalize(value); } } diff --git "a/packages/f2/test/components/interaction/__image_snapshots__/pan-test-tsx-\345\271\263\347\247\273\345\222\214\347\274\251\346\224\276-\345\271\263\347\247\273\345\222\214\347\274\251\346\224\276-dodge-\347\261\273\345\236\213-pan-\344\272\213\344\273\266-1-snap.png" "b/packages/f2/test/components/interaction/__image_snapshots__/pan-test-tsx-\345\271\263\347\247\273\345\222\214\347\274\251\346\224\276-\345\271\263\347\247\273\345\222\214\347\274\251\346\224\276-dodge-\347\261\273\345\236\213-pan-\344\272\213\344\273\266-1-snap.png" new file mode 100644 index 0000000000000000000000000000000000000000..d19cb2d70df17dfcea87b510df4cc0086dc19e2c GIT binary patch literal 11568 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 { @@ -223,4 +223,135 @@ describe('平移和缩放', () => { context.canvas.remove(); }); }); + + describe('平移和缩放-dodge 类型', () => { + const context = createContext('dodge', { + width: '350px', + height: '300px', + }); + + let canvas: Canvas; + + const data = [ + { + name: 'London', + 月份: 'Jan.', + 月均降雨量: 18.9, + }, + { + name: 'London', + 月份: 'Feb.', + 月均降雨量: 28.8, + }, + { + name: 'London', + 月份: 'Mar.', + 月均降雨量: 39.3, + }, + { + name: 'London', + 月份: 'Apr.', + 月均降雨量: 81.4, + }, + { + name: 'London', + 月份: 'May.', + 月均降雨量: 47, + }, + { + name: 'London', + 月份: 'Jun.', + 月均降雨量: 20.3, + }, + { + name: 'London', + 月份: 'Jul.', + 月均降雨量: 24, + }, + { + name: 'London', + 月份: 'Aug.', + 月均降雨量: 35.6, + }, + { + name: 'Berlin', + 月份: 'Jan.', + 月均降雨量: 12.4, + }, + { + name: 'Berlin', + 月份: 'Feb.', + 月均降雨量: 23.2, + }, + { + name: 'Berlin', + 月份: 'Mar.', + 月均降雨量: 34.5, + }, + { + name: 'Berlin', + 月份: 'Apr.', + 月均降雨量: 99.7, + }, + { + name: 'Berlin', + 月份: 'May.', + 月均降雨量: 52.6, + }, + { + name: 'Berlin', + 月份: 'Jun.', + 月均降雨量: 35.5, + }, + { + name: 'Berlin', + 月份: 'Jul.', + 月均降雨量: 37.4, + }, + { + name: 'Berlin', + 月份: 'Aug.', + 月均降雨量: 42.4, + }, + ]; + + it('初始化', async () => { + const { props } = ( + + + + + + + + + ); + + canvas = new Canvas(props); + await canvas.render(); + + await delay(1000); + expect(context).toMatchImageSnapshot(); + }); + + it('pan 事件', async () => { + await delay(20); + await gestureSimulator(context.canvas, 'touchstart', { x: 210, y: 169 }); + await delay(20); + await gestureSimulator(context.canvas, 'touchmove', { x: 100, y: 169 }); + await delay(20); + await gestureSimulator(context.canvas, 'touchend', { x: 100, y: 169 }); + await delay(300); + expect(context).toMatchImageSnapshot(); + }); + }); });