IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter--手动绘制k线图的思路 -> 正文阅读

[移动开发]Flutter--手动绘制k线图的思路


import 'dart:math';

import 'package:flutter/material.dart';
import 'package:ripp_link/page/base/base_state_page.dart';
import 'package:ripp_link/widget/base/dialog_box/tips_card.dart';

class PaintPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _PaintState();

}

class _PaintState extends State<PaintPage> {

  List<DataItem> items = [];

  @override
  void initState() {
    super.initState();

    for (int i = 0; i < 1000; i++) {
      int random1 = Random.secure().nextInt(100);
      int random2 = Random.secure().nextInt(100);
      items.add(DataItem("item:$i", min(random1, random2), max(random1, random2)));
    }

  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: SingleChildScrollView(
        scrollDirection: Axis.horizontal,
        child: SizedBox(width: items.length * 8.0, height: 300, child: GestureDetector(
          child: CustomPaint(
            painter: _Painter(items),
          ),
          onTapDown: (details) {
            updateDx(getPoint(context, details.globalPosition), false);
          },
          onTapUp: (details) {
            // updateDx(getPoint(context, details.globalPosition), true);
          },
        ),),
      ),
    );
  }


  Offset getPoint(BuildContext context, Offset globalPosition) {
    RenderBox renderBox = context.findRenderObject();
    return renderBox.globalToLocal(globalPosition);
  }

  void updateDx(Offset value, bool isEnd) {
    int index = (value.dx%8 == 0 ? value.dx/8 : value.dx / 8 + 1).round();
    TipsCard.normal(title: items[index].title);

  }

}

class DataItem {
  final int max;
  final int min;
  final String title;

  DataItem(this.title, this.min, this.max);
}

class _Painter extends CustomPainter {

  final List<DataItem> items;

  _Painter(this.items);

  var lineP = Paint()
    ..strokeCap = StrokeCap.butt
    ..strokeWidth = 6
    ..color = Colors.red;

  @override
  void paint(Canvas canvas, Size size) {
    double height = size.height;
    double dx = 0;

    for (DataItem item in items) {
      canvas.drawLine(Offset(dx, item.max / 100 * height), Offset(dx, item.min / 100 * height) , lineP);
      dx = dx + 8;
    }
  }

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

}

只渲染局部数据


import 'dart:math';

import 'package:flutter/material.dart';

const _lineWidth = 6.0;
const _lineSpace = 2.0;

class PaintPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _PaintState();

}



class _PaintState extends State<PaintPage> {

  List<DataItem> items = [];
  

  Offset startPosition;

  int start = 0;
  int end = 0;

  @override
  void initState() {
    super.initState();

    for (int i = 0; i < 1000; i++) {
      int random1 = Random.secure().nextInt(100);
      int random2 = Random.secure().nextInt(100);
      items.add(DataItem("item:$i", min(random1, random2), max(random1, random2)));
    }

  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: SizedBox(height: 300, child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) {
        double maxWidth = constraints.maxWidth;
        
        int maxLen = (maxWidth / (_lineSpace + _lineWidth)).round();

        List<DataItem> drawItems = items.sublist(start, min(start + maxLen, items.length));
        return Stack(children: [

          Positioned(child: CustomPaint(
            painter: _Painter(drawItems),
          ), top: 0, bottom: 0, left: 0, right: 0,),
          Positioned(child: GestureDetector(
            onPanUpdate: (details){
              updateDx(getPoint(context, details.globalPosition));
            },
            onPanStart: (DragStartDetails details) {
              updateDx(getPoint(context, details.globalPosition));
            },
            onPanEnd: (DragEndDetails details) {
              startPosition = null;
            },
            onTap: () {

            },
          ), top: 0, bottom: 0, left: 0, right: 0,),

        ],);
      },)),
    );
  }


  Offset getPoint(BuildContext context, Offset globalPosition) {
    RenderBox renderBox = context.findRenderObject();
    return renderBox.globalToLocal(globalPosition);
  }

  void updateDx(Offset point) {
    startPosition ??= point;
    double dx = point.dx - startPosition.dx;
    int index = (dx/8).round();

    setState(() {
      int v = start - index;
      if (v < 0) {
        start = 0;
      } else if (v >= 0 && v <= items.length) {
        start = v;
      } else {
        start = items.length;
      }
    });

    print("start : $start");
  }

}

class DataItem {
  final int max;
  final int min;
  final String title;

  DataItem(this.title, this.min, this.max);
}

class _Painter extends CustomPainter {

  final List<DataItem> items;

  _Painter(this.items);

  var lineP = Paint()
    ..strokeCap = StrokeCap.butt
    ..strokeWidth = _lineWidth
    ..color = Colors.red;

  @override
  void paint(Canvas canvas, Size size) {
    double height = size.height;
    double dx = 0;

    for (DataItem item in items) {
      canvas.drawLine(Offset(dx, item.max / 100 * height), Offset(dx, item.min / 100 * height) , lineP);
      dx = dx + _lineWidth + _lineSpace;
    }
  }

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

}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:34:21  更:2022-04-24 09:36:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 0:04:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码