Flutter 画笔(Paint) 根据坐标点 绘制曲线图

///绘制xy轴

///绘制x轴-y轴偏移量不变(y轴坐标点不变)

///绘制y轴-x轴偏移量不变(x轴坐标点不变)

void _drawXy(Canvas canvas){

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

canvas.drawLine(Offset(startX, startY), Offset(endX , startY), paint); //x轴

canvas.drawLine(Offset(startX, startY), Offset(startX, endY), paint); //y轴

}

@override

bool shouldRepaint(CustomPainter oldDelegate) {

return true;

}

}

绘制xy刻度

class CharLinePainter extends CustomPainter {

static const double basePadding = 16;//基础边界

double startX, endX;//相对于原点x轴方向最小和最大偏移量(相对于原点的偏移量)

double startY, endY;//相对于原点y轴方向最大和最小偏移量(相对于原点的偏移量)

double _fixedWidth;//x轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

double _fixedHeight;//y轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

@override

void paint(Canvas canvas, Size size) {

_initBorder(size);

_drawXy(canvas);

_drawXRuler(canvas);

}

/// 初始化边界

void _initBorder
(Size size) {

startX = basePadding * 2;

endX = size.width - basePadding * 2;

startY = size.height - basePadding * 2;

endY = basePadding * 2;

_fixedWidth = endX - startX;

_fixedHeight = startY - endY;

}

///绘制xy轴

///绘制x轴-y轴偏移量不变(y轴坐标点不变)

///绘制y轴-x轴偏移量不变(x轴坐标点不变)

void _drawXy(Canvas canvas){

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

canvas.drawLine(Offset(startX, startY), Offset(endX , startY), paint); //x轴

canvas.drawLine(Offset(startX, startY), Offset(startX, endY), paint); //y轴

}

///绘制x轴刻度

void _drawXRuler(Canvas canvas){

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

///临时刻度数量

int rulerCount=16;

///x、y轴方向每个刻度的间距

double xRulerW = _fixedWidth /rulerCount; //x方向两个点之间的距离(刻度长)

double yRulerH=_fixedHeight/rulerCount;//y轴方向亮点之间的距离(刻度高)

for (int i = 1; i <=rulerCount; i++) {

canvas.drawLine(Offset(startX + xRulerW * i, startY), Offset(startX + xRulerW * i, startY - yRulerH), paint);

canvas.drawLine(Offset(startX, startY-iyRulerH), Offset(startX + xRulerW, startY-iyRulerH), paint);

}

}

@override

bool shouldRepaint(CustomPainter oldDelegate) {

return true;

}

}

调整刻度线高度或长度

///绘制x轴刻度

void _drawXRuler(Canvas canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

///临时刻度数量

int rulerCount = 16;

///x、y轴方向每个刻度的间距

double xRulerW = _fixedWidth / rulerCount; //x方向两个点之间的距离(刻度长)

double yRulerH = _fixedHeight / rulerCount; //y轴方向亮点之间的距离(刻度高)

///减小刻度线高度或长度

double reduceRuler=10.0;

for (int i = 1; i <= rulerCount; i++) {

canvas.drawLine(Offset(startX + xRulerW * i, startY), Offset(startX + xRulerW * i, startY - yRulerH+reduceRuler), paint);

canvas.drawLine(Offset(startX, startY - i * yRulerH), Offset(startX + xRulerW-reduceRuler, startY - i * yRulerH), paint);

}

}

绘制xy刻度文本

import ‘package:flutter/material.dart’;

import ‘package:flutter/widgets.dart’;

class CharLinePainter extends CustomPainter {

static const double basePadding = 16; //基础边界

double startX, endX; //相对于原点x轴方向最小和最大偏移量(相对于原点的偏移量)

double startY, endY; //相对于原点y轴方向最大和最小偏移量(相对于原点的偏移量)

double _fixedWidth; //x轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

double _fixedHeight; //y轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

@override

void paint(Canvas canvas, Size size) {

_initBorder(size);

_drawXy(canvas);

_drawXYRulerText(canvas);

}

/// 初始化边界

void _initBorder(Size size) {

startX = basePadding * 2;

endX = size.width - basePadding * 2;

startY = size.height - basePadding * 2;

endY = basePadding * 2;

_fixedWidth = endX - startX;

_fixedHeight = startY - endY;

}

///绘制xy轴

///绘制x轴-y轴偏移量不变(y轴坐标点不变)

///绘制y轴-x轴偏移量不变(x轴坐标点不变)

void _drawXy(Canvas canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

canvas.drawLine(Offset(startX, startY), Offset(endX, startY), paint); //x轴

canvas.drawLine(Offset(startX, startY), Offset(startX, endY), paint); //y轴

}

///绘制xy轴刻度+文本

void _drawXYRulerText(Canvas canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

///临时刻度数量

int rulerCount = 16;

///x、y轴方向每个刻度的间距

double xRulerW = _fixedWidth / rulerCount; //x方向两个点之间的距离(刻度长)

double yRulerH = _fixedHeight / rulerCount; //y轴方向亮点之间的距离(刻度高)

///减小刻度线高度或长度

double reduceRuler = 10.0;

for (int i = 1; i <= rulerCount; i++) {

_drawXRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawYRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawXText(canvas, xRulerW, i);

_drawYText(canvas, yRulerH, i);

}

}

///绘制x轴刻度

void _drawXRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX + xRulerW * i;

double drawRulerSy = startY;

double drawRulerEx = startX + xRulerW * i;

double drawRulerEy = startY - yRulerH + reduceRuler;

canvas.drawLine(Offset(drawRulerSx, drawRulerSy),

Offset(drawRulerEx, drawRulerEy), paint);

}

///绘制y轴刻度

void _drawYRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX;

double drawRulerSy = startY - i * yRulerH;

double drawRulerEx = startX + xRulerW - reduceRuler;

double drawRulerEy = startY - i * yRulerH;

canvas.drawLine(Offset(drawRulerSx, drawRulerSy),

Offset(drawRulerEx, drawRulerEy), paint);

}

///绘制x轴文本

void _drawXText(Canvas canvas,double xRulerW,int i) {

TextPainter(

textAlign: TextAlign.center,

ellipsis: ‘.’,

text: TextSpan(

text: (i).toString(),

style: TextStyle(color: Colors.white, fontSize: 12.0)),

textDirection: TextDirection.ltr)

…layout(minWidth: xRulerW, maxWidth: xRulerW)

…paint(canvas, Offset(startX + xRulerW * (i - 1) - xRulerW / 2, startY+basePadding/2));

}

///绘制y轴文本

void _drawYText(Canvas canvas,double yRulerH,int i) {

TextPainter(

textAlign: TextAlign.center,

ellipsis: ‘.’,

text: TextSpan(

text: (i-1).toString(),

style: TextStyle(color: Colors.white, fontSize: 12.0)),

textDirection: TextDirection.ltr)

…layout(minWidth: yRulerH, maxWidth: yRulerH)

…paint(canvas, Offset(startX-basePadding/2*3,startY - yRulerH * (i - 1) - yRulerH / 2));

}

@override

bool shouldRepaint(CustomPainter oldDelegate) {

return true;

}

}

绘制折线图

import ‘package:flutter/material.dart’;

import ‘package:flutter/widgets.dart’;

class CharLinePainter extends CustomPainter {

static const double basePadding = 24; //基础边界

double startX, endX; //相对于原点x轴方向最小和最大偏移量(相对于原点的偏移量)

double startY, endY; //相对于原点y轴方向最大和最小偏移量(相对于原点的偏移量)

double _fixedWidth; //x轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

double _fixedHeight; //y轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

Path _path = new Path();

@override

void paint(Canvas canvas, Size size) {

_initBorder(size);

_drawXy(canvas);

_drawXYRulerText(canvas);

_drawLine(canvas);

}

/// 初始化边界

void _initBorder(Size size) {

startX = basePadding * 2;

endX = size.width - basePadding * 2;

startY = size.height - basePadding * 2;

endY = basePadding * 2;

_fixedWidth = endX - startX;

_fixedHeight = startY - endY;

}

///绘制xy轴

///绘制x轴-y轴偏移量不变(y轴坐标点不变)

///绘制y轴-x轴偏移量不变(x轴坐标点不变)

void _drawXy(Canvas canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

canvas.drawLine(Offset(startX, startY), Offset(endX, startY), paint); //x轴

canvas.drawLine(Offset(startX, startY), Offset(startX, endY), paint); //y轴

}

///绘制xy轴刻度+文本

void _drawXYRulerText(Canvas canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

///临时刻度数量

int rulerCount = 10;

///x、y轴方向每个刻度的间距

double xRulerW = _fixedWidth / rulerCount; //x方向两个点之间的距离(刻度长)

double yRulerH = _fixedHeight / rulerCount; //y轴方向亮点之间的距离(刻度高)

///减小刻度线高度或长度

double reduceRuler = 20.0;

for (int i = 1; i <= rulerCount; i++) {

_drawXRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawYRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawXText(canvas, xRulerW, i);

_drawYText(canvas, yRulerH, i);

_initPath(i-1, xRulerW, yRulerH);

}

}

///绘制x轴刻度

void _drawXRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX + xRulerW * i;

double drawRulerSy = startY;

double drawRulerEx = startX + xRulerW * i;

double drawRulerEy = startY - yRulerH + reduceRuler;

canvas.drawLine(Offset(drawRulerSx, drawRulerSy),

Offset(drawRulerEx, drawRulerEy), paint);

}

///绘制y轴刻度

void _drawYRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX;

double drawRulerSy = startY - i * yRulerH;

double drawRulerEx = startX + xRulerW - reduceRuler;

double drawRulerEy = startY - i * yRulerH;

canvas.drawLine(Offset(drawRulerSx, drawRulerSy),

Offset(drawRulerEx, drawRulerEy), paint);

}

///绘制x轴文本

void _drawXText(Canvas canvas, double xRulerW, int i) {

TextPainter(

textAlign: TextAlign.center,

ellipsis: ‘.’,

text: TextSpan(

text: ((i - 1) * xRulerW).toString(),

style: TextStyle(color: Colors.white, fontSize: 9.0)),

textDirection: TextDirection.ltr)

…layout(minWidth: xRulerW, maxWidth: xRulerW)

…paint(

canvas,

Offset(startX + xRulerW * (i - 1) - xRulerW / 2,

startY + basePadding / 2));

}

///绘制y轴文本

void _drawYText(Canvas canvas, double yRulerH, int i) {

TextPainter(

textAlign: TextAlign.center,

ellipsis: ‘.’,

text: TextSpan(

text: ((i - 1) * yRulerH).toString(),

style: TextStyle(color: Colors.white, fontSize: 9.0)),

textDirection: TextDirection.ltr)

…layout(minWidth: yRulerH, maxWidth: yRulerH)

…paint(

canvas,

Offset(startX - basePadding / 2 * 3,

startY - yRulerH * (i - 1) - yRulerH / 2));

}

///计算path

void _initPath(int i, double xRulerW, double yRulerH) {

if (i == 0) {

var key = startX;

var value = startY;

_path.moveTo(key, value);

} else {

double currentX = startX + xRulerW * i;

double currentY = (startY - (i%2==0?yRulerH:yRulerH*4));

_path.lineTo(currentX, currentY);

}

}

///绘制直线

void _drawLine(canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 2.0

…strokeCap = StrokeCap.round

…color = Colors.red

…style = PaintingStyle.stroke;

var pathMetrics = _path.computeMetrics(forceClosed: false);

var list = pathMetrics.toList();

var length = list.length.toInt();

Path linePath = new Path();

for (int i = 0; i < length; i++) {

var extractPath = list[i].extractPath(0, list[i].length, startWithMoveTo: true);

linePath.addPath(extractPath, Offset(0, 0));

}

canvas.drawPath(linePath, paint);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) {

return true;

}

}

绘制曲线图

import ‘package:flutter/material.dart’;

import ‘package:flutter/widgets.dart’;

class CharLinePainter extends CustomPainter {

static const double basePadding = 24; //基础边界

double startX, endX; //相对于原点x轴方向最小和最大偏移量(相对于原点的偏移量)

double startY, endY; //相对于原点y轴方向最大和最小偏移量(相对于原点的偏移量)

double _fixedWidth; //x轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

double _fixedHeight; //y轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

Path _path = new Path();

@override

void paint(Canvas canvas, Size size) {

_initBorder(size);

_drawXy(canvas);

_drawXYRulerText(canvas);

_drawLine(canvas);

}

/// 初始化边界

void _initBorder(Size size) {

startX = basePadding * 2;

endX = size.width - basePadding * 2;

startY = size.height - basePadding * 2;

endY = basePadding * 2;

_fixedWidth = endX - startX;

_fixedHeight = startY - endY;

}

///绘制xy轴

///绘制x轴-y轴偏移量不变(y轴坐标点不变)

///绘制y轴-x轴偏移量不变(x轴坐标点不变)

void _drawXy(Canvas canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

canvas.drawLine(Offset(startX, startY), Offset(endX, startY), paint); //x轴

canvas.drawLine(Offset(startX, startY), Offset(startX, endY), paint); //y轴

}

///绘制xy轴刻度+文本

void _drawXYRulerText(Canvas canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

///临时刻度数量

int rulerCount = 10;

///x、y轴方向每个刻度的间距

double xRulerW = _fixedWidth / rulerCount; //x方向两个点之间的距离(刻度长)

double yRulerH = _fixedHeight / rulerCount; //y轴方向亮点之间的距离(刻度高)

///减小刻度线高度或长度

double reduceRuler = 20.0;

for (int i = 1; i <= rulerCount; i++) {

_drawXRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawYRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawXText(canvas, xRulerW, i);

_drawYText(canvas, yRulerH, i);

_initCurvePath(i-1, xRulerW, yRulerH);

}

}

///绘制x轴刻度

void _drawXRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX + xRulerW * i;

double drawRulerSy = startY;

double drawRulerEx = startX + xRulerW * i;

double drawRulerEy = startY - yRulerH + reduceRuler;

canvas.drawLine(Offset(drawRulerSx, drawRulerSy),

Offset(drawRulerEx, drawRulerEy), paint);

}

///绘制y轴刻度

void _drawYRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX;

double drawRulerSy = startY - i * yRulerH;

double drawRulerEx = startX + xRulerW - reduceRuler;

double drawRulerEy = startY - i * yRulerH;

canvas.drawLine(Offset(drawRulerSx, drawRulerSy),

Offset(drawRulerEx, drawRulerEy), paint);

}

///绘制x轴文本

void _drawXText(Canvas canvas, double xRulerW, int i) {

TextPainter(

textAlign: TextAlign.center,

ellipsis: ‘.’,

text: TextSpan(

text: ((i - 1) * xRulerW).toString(),

style: TextStyle(color: Colors.white, fontSize: 9.0)),

textDirection: TextDirection.ltr)

…layout(minWidth: xRulerW, maxWidth: xRulerW)

…paint(

canvas,

Offset(startX + xRulerW * (i - 1) - xRulerW / 2,

startY + basePadding / 2));

}

///绘制y轴文本

void _drawYText(Canvas canvas, double yRulerH, int i) {

TextPainter(

textAlign: TextAlign.center,

ellipsis: ‘.’,

text: TextSpan(

text: ((i - 1) * yRulerH).toString(),

style: TextStyle(color: Colors.white, fontSize: 9.0)),

textDirection: TextDirection.ltr)

…layout(minWidth: yRulerH, maxWidth: yRulerH)

…paint(

canvas,

Offset(startX - basePadding / 2 * 3,

startY - yRulerH * (i - 1) - yRulerH / 2));

}

///计算曲线path

void _initCurvePath(int i, double xRulerW, double yRulerH) {

if (i == 0) {

var key = startX;

var value = startY;

_path.moveTo(key, value);

} else {

double preX = startX + xRulerW * (i-1);

double preY = (startY - (i%2!=0?yRulerH:yRulerH*6));

double currentX = startX + xRulerW * i;

double currentY = (startY - (i%2==0?yRulerH:yRulerH*6));

_path.cubicTo((preX + currentX) / 2, preY, (preX + currentX) / 2, currentY, currentX, currentY);

}

}

///绘制直线或曲线

void _drawLine(canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 2.0

…strokeCap = StrokeCap.round

…color = Colors.red

…style = PaintingStyle.stroke;

var pathMetrics = _path.computeMetrics(forceClosed: false);

var list = pathMetrics.toList();

var length = list.length.toInt();

Path linePath = new Path();

for (int i = 0; i < length; i++) {

var extractPath = list[i].extractPath(0, list[i].length, startWithMoveTo: true);

linePath.addPath(extractPath, Offset(0, 0));

}

canvas.drawPath(linePath, paint);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) {

return true;

}

}

绘制阴影

class CharLinePainter extends CustomPainter {

static const double basePadding = 24; //基础边界

double startX, endX; //相对于原点x轴方向最小和最大偏移量(相对于原点的偏移量)

double startY, endY; //相对于原点y轴方向最大和最小偏移量(相对于原点的偏移量)

double _fixedWidth; //x轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

double _fixedHeight; //y轴方向:最大偏移量-最小偏移量(相对于原点的偏移量)

Path _path = new Path();

@override

void paint(Canvas canvas, Size size) {

_initBorder(size);

_drawXy(canvas);

_drawXYRulerText(canvas);

_drawLine(canvas);

}

/// 初始化边界

void _initBorder(Size size) {

startX = basePadding * 2;

endX = size.width - basePadding * 2;

startY = size.height - basePadding * 2;

endY = basePadding * 2;

_fixedWidth = endX - startX;

_fixedHeight = startY - endY;

}

///绘制xy轴

///绘制x轴-y轴偏移量不变(y轴坐标点不变)

///绘制y轴-x轴偏移量不变(x轴坐标点不变)

void _drawXy(Canvas canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

canvas.drawLine(Offset(startX, startY), Offset(endX, startY), paint); //x轴

canvas.drawLine(Offset(startX, startY), Offset(startX, endY), paint); //y轴

}

///绘制xy轴刻度+文本

void _drawXYRulerText(Canvas canvas) {

var paint = Paint()

…isAntiAlias = true

…strokeWidth = 1.0

…strokeCap = StrokeCap.square

…color = Colors.white

…style = PaintingStyle.stroke;

///临时刻度数量

int rulerCount = 10;

///x、y轴方向每个刻度的间距

double xRulerW = _fixedWidth / rulerCount; //x方向两个点之间的距离(刻度长)

double yRulerH = _fixedHeight / rulerCount; //y轴方向亮点之间的距离(刻度高)

///减小刻度线高度或长度

double reduceRuler = 20.0;

for (int i = 1; i <= rulerCount; i++) {

_drawXRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawYRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawXText(canvas, xRulerW, i);

_drawYText(canvas, yRulerH, i);

_initCurvePath(i - 1, xRulerW, yRulerH);

}

}

///绘制x轴刻度

void _drawXRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX + xRulerW * i;

double drawRulerSy = startY;

double drawRulerEx = startX + xRulerW * i;

double drawRulerEy = startY - yRulerH + reduceRuler;

canvas.drawLine(Offset(drawRulerSx, drawRulerSy),

Offset(drawRulerEx, drawRulerEy), paint);

}

///绘制y轴刻度

void _drawYRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX;

double drawRulerSy = startY - i * yRulerH;

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取
ixedWidth / rulerCount; //x方向两个点之间的距离(刻度长)

double yRulerH = _fixedHeight / rulerCount; //y轴方向亮点之间的距离(刻度高)

///减小刻度线高度或长度

double reduceRuler = 20.0;

for (int i = 1; i <= rulerCount; i++) {

_drawXRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawYRuler(canvas, xRulerW, yRulerH, reduceRuler, i, paint);

_drawXText(canvas, xRulerW, i);

_drawYText(canvas, yRulerH, i);

_initCurvePath(i - 1, xRulerW, yRulerH);

}

}

///绘制x轴刻度

void _drawXRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX + xRulerW * i;

double drawRulerSy = startY;

double drawRulerEx = startX + xRulerW * i;

double drawRulerEy = startY - yRulerH + reduceRuler;

canvas.drawLine(Offset(drawRulerSx, drawRulerSy),

Offset(drawRulerEx, drawRulerEy), paint);

}

///绘制y轴刻度

void _drawYRuler(Canvas canvas, double xRulerW, double yRulerH,

double reduceRuler, int i, var paint) {

double drawRulerSx = startX;

double drawRulerSy = startY - i * yRulerH;

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中…(img-XasgQF11-1719053768546)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

Flutter中,使用高德地图绘制轨迹需要以下几个步骤: 第一步,需要在pubspec.yaml文件中添加高德地图插件依赖。可以在Flutter官方插件网站找到相关的插件信息,并将其添加到pubspec.yaml中。 第二步,创建一个地图页面并引入相关的库文件。在Flutter中,可以使用‘import’语句导入所需的库文件。然后,创建一个StatefulWidget类,并在build方法中返回一个Scaffold组件作为页面的根组件。 第三步,获取定位数据。使用Flutter的定位插件获取当前设备的位置信息。可以在页面初始化时通过初始化插件,并获取位置信息。然后,将位置信息传递给地图组件。 第四步,将地图放置在页面上。可以使用高德地图插件提供的MapView组件将地图添加到页面中。同时,配置相关的地图参数,如地图的缩放级别、中心等。 第五步,绘制轨迹。将获取到的位置信息按时间顺序记录下来,并在地图上根据位置数据绘制轨迹。可以使用高德地图插件提供的Polyline组件进行轨迹的绘制。 第六步,更新轨迹。随着设备位置的变化,需要实时更新轨迹。可以通过监听定位插件的位置变化事件,获取到最新的位置信息,并更新轨迹。 最后,注意进行相关的错误处理和资源释放工作。在使用过程中,需要注意处理异常情况,如设备不支持定位等。同时,在不需要使用地图时,需要释放相关的资源,以免造成资源浪费。 综上所述,使用Flutter绘制高德地图的轨迹需要引入相关的插件依赖,获取设备的位置信息,将地图添加到页面上并配置相关参数,根据位置数据绘制轨迹,并实时更新轨迹。同时还需处理异常情况和释放资源。这样就可以实现在Flutter绘制高德地图轨迹的功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值