Skip to content

Commit 68b5038

Browse files
committed
feat:custom render box
1 parent b3a9c24 commit 68b5038

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

lib/main.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import 'view/persist_key_value.dart';
2323
import 'view/tips_calculator.dart';
2424
import 'view/whats_app.dart';
2525
import 'view/animation_demo.dart';
26+
import 'view/custom_render_box.dart';
2627
// import 'package:flutter_examples_code/view/navigation_drawer/screens/home.dart';
2728
import 'package:flutter_examples_code/view/navigation_drawer/screens/account.dart';
2829
import 'package:flutter_examples_code/view/navigation_drawer/screens/setting.dart';
@@ -72,6 +73,7 @@ class MyApp extends StatelessWidget {
7273
// "navigation_draw": (context)=> new HomeScreen(),
7374
"whats_app": (context)=> new WhatsAppScreen(),
7475
"animation_demo": (context)=> new AnimationDemo(),
76+
"custom_render_box": (context)=> new CustomRenderBox(),
7577
},
7678
home: MyHomePage(title: '首页'),
7779
);
@@ -328,7 +330,14 @@ class _MyHomePageState extends State<MyHomePage> {
328330
onPressed: (){
329331
Navigator.pushNamed(context, "animation_demo");
330332
},
331-
)
333+
),
334+
FlatButton(
335+
child: Text('Custom Render Box',style: textStyle),
336+
textColor: Colors.blue,
337+
onPressed: (){
338+
Navigator.pushNamed(context, "custom_render_box");
339+
},
340+
),
332341
],
333342
),
334343
),

lib/view/custom_render_box.dart

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter/rendering.dart';
3+
4+
class RenderDots extends RenderConstrainedBox{
5+
RenderDots() : super(additionalConstraints:const BoxConstraints.expand());
6+
7+
@override
8+
bool hitTestSelf(Offset position) => true;
9+
10+
final Map<int, Offset> _dots = <int, Offset>{};
11+
12+
@override
13+
void handleEvent(PointerEvent event, BoxHitTestEntry entry){
14+
if(event is PointerDownEvent || event is PointerMoveEvent){
15+
_dots[event.pointer] = event.position;
16+
markNeedsPaint();
17+
} else if(event is PointerUpEvent || event is PointerCancelEvent){
18+
_dots.remove(event.pointer);
19+
markNeedsLayout();
20+
}
21+
}
22+
23+
@override
24+
void paint(PaintingContext context, Offset offset){
25+
final Canvas canvas = context.canvas;
26+
canvas.drawRect(offset & size, Paint()..color = const Color(0xFF0000FF));
27+
28+
final Paint paint = Paint()..color = const Color(0xFF00FF00);
29+
for(Offset point in _dots.values){
30+
canvas.drawCircle(point, 50.0, paint);
31+
}
32+
super.paint(context, offset);
33+
}
34+
}
35+
36+
class Dots extends SingleChildRenderObjectWidget{
37+
const Dots({Key key, Widget child}): super(key:key,child: child);
38+
39+
@override
40+
RenderDots createRenderObject(BuildContext context) => RenderDots();
41+
}
42+
43+
class CustomRenderBox extends StatelessWidget {
44+
@override
45+
Widget build(BuildContext context) {
46+
return new Scaffold(
47+
appBar: new AppBar(
48+
title: new Text('Custom Render Box'),
49+
),
50+
body:SafeArea(
51+
child: const Directionality(
52+
textDirection: TextDirection.ltr,
53+
child: Dots(
54+
child: Center(
55+
child: Text('TOUCH ME!'),
56+
)
57+
)
58+
),
59+
)
60+
);
61+
}
62+
}

0 commit comments

Comments
 (0)