首页 > 其他分享 >flutter的custompaint组件示例5

flutter的custompaint组件示例5

时间:2024-10-20 13:49:04浏览次数:9  
标签:custompaint 圆角 示例 拖动 Flutter 组件 position 矩形 flutter

这段代码是一个简单的Flutter应用程序,它创建了一个可拖动的自定义圆角矩形组件。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Draggable Custom UI Component Example'),
        ),
        body: DraggableCustomRoundedRectangle(),
      ),
    );
  }
}

class DraggableCustomRoundedRectangle extends StatefulWidget {
  @override
  _DraggableCustomRoundedRectangleState createState() =>
      _DraggableCustomRoundedRectangleState();
}

class _DraggableCustomRoundedRectangleState
    extends State<DraggableCustomRoundedRectangle> {
  Offset _position = Offset(0.0, 0.0);

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        Positioned(
          left: _position.dx,
          top: _position.dy,
          child: GestureDetector(
            onPanUpdate: (details) {
              setState(() {
                _position += details.delta;
              });
            },
            child: CustomPaint(
              painter: RoundedRectanglePainter(),
              child: Container(
                width: 200,
                height: 100,
                alignment: Alignment.center,
                child: Text(
                  'Drag me!',
                  style: TextStyle(color: Colors.white, fontSize: 18),
                ),
              ),
            ),
          ),
        ),
      ],
    );
  }
}

class RoundedRectanglePainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    Paint paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.fill
      ..strokeWidth = 2;

    Rect rect = Rect.fromLTWH(0, 0, size.width, size.height);
    RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(10));

    // Draw the rounded rectangle
    canvas.drawRRect(rRect, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}

以下是对这段代码的分析:
一、整体功能概述
这段 Flutter 代码实现了一个可拖动的自定义圆角矩形 UI 组件。用户可以在屏幕上拖动这个带有 “Drag me!” 文本的蓝色圆角矩形。

二、代码结构解析
导入部分
import ‘package:flutter/material.dart’;:导入 Flutter 的核心库,以便使用 Flutter 提供的各种 UI 组件和功能。

main函数
void main() { runApp(MyApp()); }:这是应用的入口点,调用runApp函数并传入MyApp实例,启动整个 Flutter 应用。

MyApp类
继承自StatelessWidget,表示这是一个无状态的组件。
build方法中返回一个MaterialApp,设置了应用的标题栏和主页内容。
标题栏显示为 “Draggable Custom UI Component Example”。
主页内容是一个Scaffold,其中包含一个AppBar和一个名为DraggableCustomRoundedRectangle的自定义组件。

DraggableCustomRoundedRectangle类
继承自StatefulWidget,表示这是一个有状态的组件。
createState方法返回一个_DraggableCustomRoundedRectangleState实例,用于管理该组件的状态。

_DraggableCustomRoundedRectangleState类
定义了一个Offset _position变量,用于记录圆角矩形的位置。
build方法中使用Stack布局,将一个可拖动的圆角矩形放置在特定位置。
通过Positioned组件根据_position变量确定圆角矩形的位置。
GestureDetector用于检测用户的拖动操作,当用户拖动时,通过onPanUpdate回调函数更新_position变量,并调用setState方法触发界面重新绘制。
内部使用CustomPaint和RoundedRectanglePainter绘制圆角矩形,并在矩形中间显示 “Drag me!” 文本。

RoundedRectanglePainter类
继承自CustomPainter,用于自定义绘制圆角矩形。
paint方法中定义了画笔的颜色、样式和宽度,然后创建一个矩形和圆角矩形,并使用画布绘制这个圆角矩形。
shouldRepaint方法返回false,表示在没有状态变化时不需要重新绘制这个画家。

三、总结
这段代码通过组合使用 Flutter 的各种组件和自定义画家,实现了一个具有特定功能的可拖动圆角矩形 UI 组件,展示了 Flutter 在自定义 UI 设计和交互方面的强大能力。

标签:custompaint,圆角,示例,拖动,Flutter,组件,position,矩形,flutter
From: https://blog.csdn.net/weixin_42668920/article/details/143056213

相关文章

  • SpringBoot + Activiti工作流项目示例(源码)
    前言activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。一、项目形式springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务。工......
  • AOP - Advisor 示例
    定义通知publicclassLoggingAdviceimplementsMethodInterceptor{@OverridepublicObjectinvoke(MethodInvocationinvocation)throwsThrowable{System.out.println("Method"+invocation.getMethod().getName()+"isbeingcalle......
  • AOP - AspectJ 示例
    //自定义注解@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public@interfaceLogExecution{}@Aspect//切面类@Order(1000)//数字越小,优先级越高@Component//也要注册到容器publicclassLoggingAspect{//定义切点@Pointcut("ex......
  • 低功耗4G模组:tcs3472颜色传感器示例
    ​今天我们学习合宙低功耗4G模组Air780EP的LuatOS开发tcs3472示例,文末【阅读原文】获取最新资料1一、简介tcs3472颜色传感器能够读取照射到的物体的RGB三种数值,从而识别颜色关联文档和使用工具:LuatOS固件获取tcs3472颜色传感器接口说明Luatools下载调试工具二......
  • 低功耗4G模组:LCD应用示例
    ​今天我们学习合宙Air780E开发板LCD应用示例,文末【阅读原文】获取最新资料。本文档适用于Air780E开发板关联文档和使用工具lcd-demo:https://gitee.com/openLuat/LuatOS/tree/master/demo/lcdLuatools下载调试工具一、环境准备1.1Air780E开发板一套 ​1.......
  • celery简单配置示例
    目录生产者消费者配置信息celery的配置文件示例celer简单示例tree-I'containerd|vminit|__pycache__'.#app.py属于生产者├──app.py#celery_app用于配置消费者及队列信息└──celery_app#confi.py配置信息├──config.py#__init__.pycelery实例初始......
  • java堆排序的示例代码
    publicclassHeapSort{publicstaticvoidmain(String[]args){int[]arr={12,11,13,5,6,7};System.out.println("Originalarray:");for(intvalue:arr){System.out.print(value+"");......
  • RabbitMQ 通配符(Topic)模式示例
    总结自:BV15k4y1k7Ep模式说明Topic类型与Direct相比,都是可以根据Routingkey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routingkey的时候使用通配符!Topic类型的Routingkey一般都是由一个或多个单词组成,多个单词之间以.分隔,例如:item.insert通配符规......
  • RabbitMQ 路由(Routing)模式示例
    总结自:BV15k4y1k7Ep模式说明和消费订阅模式相比,路由模式特点:交换机的类型为Direct。队列与交换机绑定时,要指定一个Routingkey(路由key)。消息的发送方在向Exchange发送消息时,也必须指定消息的Routingkey。Exchange不再把消息交给每一个绑定的队列,而是根据消息的Rout......
  • RabbitMQ 发布订阅(Publish Subscribe)模式示例
    总结自:BV15k4y1k7Ep交换机订阅模式示例图:在简单模式和工作队列模式中,只有3个角色:P:生产者,也就是要发送消息的程序。C:消费者,消息的接受者,会一直等待消息到来。Queue:消息队列,图中红色部分。而在订阅模型中,多了一个Exchange角色,而且工作过程略有变化:P:生产者,也就是要......