Skip to content

Commit f06ce14

Browse files
author
fbchen
committed
support translate
1 parent 0889bdc commit f06ce14

File tree

2 files changed

+72
-25
lines changed

2 files changed

+72
-25
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ ConstraintLayout will only be measured once, This results in extremely high layo
1414
5. constraint integrity hint
1515
6. bias
1616
7. z-index
17+
8. translate
1718

1819
Coming soon:
1920

@@ -42,7 +43,7 @@ dependencies:
4243
flutter_constraintlayout:
4344
git:
4445
url: 'https://github.com/hackware1993/Flutter-ConstraintLayout.git'
45-
ref: 'v0.1-alpha3'
46+
ref: 'v0.1-alpha4'
4647
```
4748
4849
# Example

lib/constrait_layout/constraint_layout.dart

Lines changed: 70 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ class _ConstraintBoxData extends ContainerBoxParentData<RenderBox> {
145145
double? horizontalBias;
146146
double? verticalBias;
147147
int? zIndex;
148+
Offset? translate;
149+
bool? translateDependency;
148150
}
149151

150152
class Constrained extends ParentDataWidget<_ConstraintBoxData> {
@@ -183,6 +185,8 @@ class Constrained extends ParentDataWidget<_ConstraintBoxData> {
183185
final bool? centerVertical;
184186

185187
final int? zIndex;
188+
final Offset? translate;
189+
final bool? translateDependency;
186190

187191
// TODO support chain
188192
// final ChainStyle? chainStyle;
@@ -219,6 +223,8 @@ class Constrained extends ParentDataWidget<_ConstraintBoxData> {
219223
this.horizontalBias,
220224
this.verticalBias,
221225
this.zIndex,
226+
this.translate,
227+
this.translateDependency,
222228
}) : super(
223229
key: key,
224230
child: child,
@@ -398,6 +404,19 @@ class Constrained extends ParentDataWidget<_ConstraintBoxData> {
398404
needsReorderChildren = true;
399405
}
400406

407+
if (parentData.translateDependency != translateDependency) {
408+
parentData.translateDependency = translateDependency;
409+
needsLayout = true;
410+
}
411+
412+
if (parentData.translate != translate) {
413+
parentData.translate = translate;
414+
if (parentData.translateDependency == true) {
415+
needsLayout = true;
416+
}
417+
needsPaint = true;
418+
}
419+
401420
if (needsLayout) {
402421
AbstractNode? targetParent = renderObject.parent;
403422
if (targetParent is RenderObject) {
@@ -1205,31 +1224,39 @@ class _ConstraintRenderBox extends RenderBox
12051224
if (element.shouldNotPaint()) {
12061225
continue;
12071226
}
1227+
1228+
Offset clickShift = const Offset(0, 0);
1229+
if (element.translateDependency != true) {
1230+
if (element.translate != null) {
1231+
clickShift = element.translate!;
1232+
}
1233+
}
1234+
12081235
// expand the click area without changing the actual size
12091236
Offset offsetPos = Offset(position.dx, position.dy);
12101237
EdgeInsets? clickPadding = element.clickPadding;
12111238
if (clickPadding != null) {
1212-
double clickPaddingLeft = element.getX() - clickPadding.left;
1213-
double clickPaddingTop = element.getY() - clickPadding.top;
1214-
double clickPaddingRight = element.getX() +
1215-
element.getMeasuredWidth(size) +
1216-
clickPadding.right;
1217-
double clickPaddingBottom = element.getY() +
1218-
element.getMeasuredHeight(size) +
1219-
clickPadding.bottom;
1239+
double x = element.getX();
1240+
x += clickShift.dx;
1241+
double y = element.getY();
1242+
y += clickShift.dy;
1243+
double clickPaddingLeft = x - clickPadding.left;
1244+
double clickPaddingTop = y - clickPadding.top;
1245+
double clickPaddingRight =
1246+
x + element.getMeasuredWidth(size) + clickPadding.right;
1247+
double clickPaddingBottom =
1248+
y + element.getMeasuredHeight(size) + clickPadding.bottom;
12201249
double xClickPercent = (offsetPos.dx - clickPaddingLeft) /
12211250
(clickPaddingRight - clickPaddingLeft);
12221251
double yClickPercent = (offsetPos.dy - clickPaddingTop) /
12231252
(clickPaddingBottom - clickPaddingTop);
1224-
double realClickX =
1225-
element.getX() + xClickPercent * element.getMeasuredWidth(size);
1226-
double realClickY =
1227-
element.getY() + yClickPercent * element.getMeasuredHeight(size);
1253+
double realClickX = x + xClickPercent * element.getMeasuredWidth(size);
1254+
double realClickY = y + yClickPercent * element.getMeasuredHeight(size);
12281255
offsetPos = Offset(realClickX, realClickY);
12291256
}
12301257

12311258
bool isHit = result.addWithPaintOffset(
1232-
offset: element.offset,
1259+
offset: element.offset + clickShift,
12331260
position: offsetPos,
12341261
hitTest: (BoxHitTestResult result, Offset transformed) {
12351262
return element.renderBox!.hitTest(result, position: transformed);
@@ -1274,7 +1301,15 @@ class _ConstraintRenderBox extends RenderBox
12741301
if (element.shouldNotPaint()) {
12751302
continue;
12761303
}
1277-
context.paintChild(element.renderBox!, element.offset + offset);
1304+
1305+
Offset paintShift = const Offset(0, 0);
1306+
if (element.translateDependency != true) {
1307+
if (element.translate != null) {
1308+
paintShift = element.translate!;
1309+
}
1310+
}
1311+
context.paintChild(
1312+
element.renderBox!, element.offset + offset + paintShift);
12781313
// draw child's click area
12791314
assert(() {
12801315
if (_debugShowClickArea == true) {
@@ -1290,7 +1325,8 @@ class _ConstraintRenderBox extends RenderBox
12901325
element.getY() +
12911326
element.getMeasuredHeight(size) +
12921327
_getBottomInsets(clickPadding));
1293-
context.canvas.drawRect(rect.shift(offset), paint);
1328+
rect = rect.shift(offset).shift(paintShift);
1329+
context.canvas.drawRect(rect, paint);
12941330
ui.ParagraphBuilder paragraphBuilder =
12951331
ui.ParagraphBuilder(ui.ParagraphStyle(
12961332
textAlign: TextAlign.center,
@@ -1299,15 +1335,10 @@ class _ConstraintRenderBox extends RenderBox
12991335
paragraphBuilder.addText("CLICK AREA");
13001336
ui.Paragraph paragraph = paragraphBuilder.build();
13011337
paragraph.layout(ui.ParagraphConstraints(
1302-
width: element.getMeasuredWidth(size),
1338+
width: rect.width,
13031339
));
13041340
context.canvas.drawParagraph(
1305-
paragraph,
1306-
(element.offset + offset) +
1307-
Offset(
1308-
0,
1309-
(element.getMeasuredHeight(size) - paragraph.height) /
1310-
2));
1341+
paragraph, rect.centerLeft + Offset(0, -paragraph.height / 2));
13111342
}
13121343
return true;
13131344
}());
@@ -1325,7 +1356,8 @@ class _ConstraintRenderBox extends RenderBox
13251356
paragraph.layout(ui.ParagraphConstraints(
13261357
width: element.getMeasuredWidth(size),
13271358
));
1328-
context.canvas.drawParagraph(paragraph, (element.offset + offset));
1359+
context.canvas
1360+
.drawParagraph(paragraph, element.offset + offset + paintShift);
13291361
}
13301362
return true;
13311363
}());
@@ -1367,7 +1399,21 @@ class _NodeDependency {
13671399

13681400
int get zIndex => parentData.zIndex ?? index;
13691401

1370-
Offset get offset => parentData.offset;
1402+
Offset get offset {
1403+
if (translate == null) {
1404+
return parentData.offset;
1405+
} else {
1406+
if (translateDependency == true) {
1407+
return parentData.offset + translate!;
1408+
} else {
1409+
return parentData.offset;
1410+
}
1411+
}
1412+
}
1413+
1414+
Offset? get translate => parentData.translate;
1415+
1416+
bool? get translateDependency => parentData.translateDependency;
13711417

13721418
EdgeInsets? get margin => parentData.margin;
13731419

0 commit comments

Comments
 (0)