- vừa được xem lúc

Flutter: CustomPaint [Phần 2]

0 0 20

Người đăng: Tran Van Tan

Theo Viblo Asia

Ở phần trước ta đã tìm hiều các vẽ những nét thẳng tròn đơn giản. Nhưng bạn muốn hơn thế nữa, muốn vẽ các đường cong uốn lượn hay chỉ một phần của đường tròn... Thì bài này là dành cho điều đó. Lớp Path ngoài việc vẽ các đường thẳng như được giới thiệu trong bài trước, nó còn cung cấp những hàm đặc biệt giúp ta vẽ các đường cong.

Vẽ đường cong

quadraticBezierTo

quadraticBezierTo là hàm vẽ 1 đường cong Bezier bậc 2.

Ví dụ sau ta vẽ 1 đường cong Bezier từ 3 điểm (0, height/2) (trung điểm của cạnh trái) (width / 2,height) (trung điểm của cạnh dưới - điểm kiểm soát) (width, height/2) (trung điểm của cạnh phải)

  void paint(Canvas canvas, Size size) { Paint paint = Paint() ..color = Colors.red ..style = PaintingStyle.stroke ..strokeWidth = 8.0; Path path = Path(); path.moveTo(0, size.height / 2); path.quadraticBezierTo(size.width / 2, size.height, size.width, size.height / 2); canvas.drawPath(path, paint); }

Bạn có thể chạy thử code ở đây Run

cubicTo

Là hàm vẽ 1 đường cong Bezier bậc 3. Không giống như quadraticBezierTo, cubicTo có tới 2 điểm kiểm soát . Do đó bạn có thể tính toán chọn điểm kiểm soát để có thể tạo được 1 đường lượn sóng.

  void paint(Canvas canvas, Size size) { Paint paint = Paint() ..color = Colors.red ..style = PaintingStyle.stroke ..strokeWidth = 8.0; Path path = Path(); path.cubicTo(size.width / 4, 3 * size.height / 4, 3 * size.width / 4, size.height / 4, size.width, size.height); canvas.drawPath(path, paint); }

Run

conicTo

conicTo về cơ bản cũng hoạt động giống như quadraticBeizerTo với sự khác biệt duy nhất là biến trọng số. Nếu trọng số lớn hơn 1, hình được vẽ là hyperbol. Nếu trọng số là 1 thì hình được vẽ là hình parabol và nếu nó nhỏ hơn 1, hình được vẽ sẽ là hình elip.

  void paint(Canvas canvas, Size size) { Paint paint = Paint() ..color = Colors.red ..style = PaintingStyle.stroke ..strokeWidth = 8.0; Path path = Path(); path.conicTo(size.width / 4, 3 * size.height / 4, size.width, size.height, 20); canvas.drawPath(path, paint); }

Run

arcTo

arcTo là hàm vẽ 1 phần hình oval từ góc bắt đầu đến góc kết thúc (đo bằng radian)

  void paint(Canvas canvas, Size size) { Paint paint = Paint() ..color = Colors.red ..style = PaintingStyle.stroke ..strokeWidth = 8.0; // Method to convert degree to radians num degToRad(num deg) => deg * (Math.pi / 180.0); Path path = Path(); path.arcTo(Rect.fromLTWH(size.width / 2, size.height / 2, size.width / 4, size.height / 4), degToRad(0), degToRad(90), true); canvas.drawPath(path, paint); }

Run

Các fuction khác

addRect

  void paint(Canvas canvas, Size size) { Paint paint = Paint() ..color = Colors.red ..style = PaintingStyle.stroke ..strokeWidth = 8.0; Path path = Path(); // Adds a rectangle path.addRect(Rect.fromLTWH(size.width / 2, size.height / 2, size.width / 4, size.height / 4)); canvas.drawPath(path, paint); }

addRRect

Hình chữ nhật với các góc được bo tròn

  void paint(Canvas canvas, Size size) { Paint paint = Paint() ..color = Colors.red ..style = PaintingStyle.stroke ..strokeWidth = 8.0; Path path = Path(); path.addRRect( RRect.fromRectAndRadius(Rect.fromLTWH(size.width / 2, size.height / 2, size.width / 4, size.height / 4), Radius.circular(16)) ); canvas.drawPath(path, paint); }

Cảm ơn các bạn đã theo dõi bài viết !!

Nguồn

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 284

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

0 0 228

- vừa được xem lúc

Flutter Animation: Creating medium’s clap animation in flutte Part II

Trong phần 1 mình đã giới thiệu với các bạn cơ bản về Animation trong Flutter. Score Widget Size Animation.

0 0 64

- vừa được xem lúc

Flutter - GetX - Using GetConnect to handle API request (Part 4)

Giới thiệu. Xin chào các bạn, lại là mình với series về GetX và Flutter.

0 0 359

- vừa được xem lúc

StatefulWidget và StatelessWidget trong Flutter

I. Mở đầu. Khi các bạn build một ứng dụng với Flutter thì Widgets là thứ không thể thiếu đúng không ạ. Và 2 loại Widget không thể thiếu đó là StatefullWidget và StatelessWidget.

0 0 145

- vừa được xem lúc

Tìm hiểu về Riverpod - Provider nhưng không hắn :v

Trong Flutter có rất nhiều các quản lý state: Provider, Bloc, GetX, Redux,... khó mà nói cái nào tốt hơn cái nào. Tuy nhiên nếu bạn đã làm quen với Provider thì không ngại để tìm hiểu thêm về Riverpod. Một bản nâng cấp của Provider. Nếu bạn để ý thì cái tên "Riverpod" là các chữ cái của "Provider" đ

0 0 67