android - 用画线颤动画一个圆
问题描述
嗨,我正在尝试在颤动中仅使用 drawLine() 画布方法绘制一个圆圈,以制作一个看起来像这样的圆圈:
这是为了在我的应用程序中制作一个速度计,如果可能的话,我想在不使用任何其他依赖项的情况下这样做。
任何帮助表示赞赏,谢谢
解决方案
可以直接使用/fork或者参考https://pub.dev/packages/flutter_gauge
github源码https://github.com/alitorki2651/flutter_gauge/tree/master/lib的源码
工作演示
完整的示例代码
import 'package:flutter/material.dart';
import 'package:flutter_gauge/flutter_gauge.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: <Widget>[
Padding(
padding: EdgeInsets.only(right: 60),
child: FlutterGauge(
index: 50,
hand: Hand.short,
number: Number.endAndCenterAndStart,
secondsMarker: SecondsMarker.secondsAndMinute,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 25,
),
),
),
Row(
children: <Widget>[
Expanded(
child: FlutterGauge(
index: 50,
hand: Hand.short,
number: Number.endAndCenterAndStart,
secondsMarker: SecondsMarker.secondsAndMinute,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 25,
),
),
),
// Expanded(child: FlutterGauge(secondsMarker: SecondsMarker.none,hand: Hand.short,number: Number.none,width: 200,index: 38.0,fontFamily: "Iran",counterStyle: TextStyle(color: Colors.black,fontSize: 35),counterAlign: CounterAlign.center,isDecimal: false),),
],
),
Row(
children: <Widget>[
Expanded(
child: FlutterGauge(
handSize: 30,
width: 200,
index: 50.0,
fontFamily: "Iran",
end: 100,
number: Number.endAndCenterAndStart,
secondsMarker: SecondsMarker.secondsAndMinute,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 25,
)),
),
// Expanded(child: FlutterGauge(secondsMarker: SecondsMarker.none,hand: Hand.short,number: Number.none,width: 200,index: 38.0,fontFamily: "Iran",counterStyle: TextStyle(color: Colors.black,fontSize: 35),counterAlign: CounterAlign.center,isDecimal: false),),
],
),
Row(
children: <Widget>[
Expanded(
child: FlutterGauge(
handSize: 30,
width: 200,
index: 80.0,
fontFamily: "Iran",
end: 100,
number: Number.endAndCenterAndStart,
secondsMarker: SecondsMarker.secondsAndMinute,
hand: Hand.short,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 22,
)),
),
// Expanded(child: FlutterGauge(handSize: 30,width: 200,index: 65.0,fontFamily: "Iran",end: 500,number: Number.endAndStart,secondsMarker: SecondsMarker.minutes,isCircle: false,counterStyle: TextStyle(color: Colors.black,fontSize: 25,)),),
],
),
Row(
children: <Widget>[
Expanded(
child: Container(
color: Colors.black38,
child: FlutterGauge(
inactiveColor: Colors.white38,
activeColor: Colors.white,
handSize: 30,
width: 200,
index: 65.0,
fontFamily: "Iran",
end: 400,
number: Number.none,
secondsMarker: SecondsMarker.minutes,
isCircle: false,
hand: Hand.none,
counterAlign: CounterAlign.center,
counterStyle: TextStyle(
color: Colors.white,
fontSize: 30,
),
isDecimal: false,
)),
),
// Expanded(child: FlutterGauge(width: 200,index: 67.3,fontFamily: "Iran",counterStyle: TextStyle(color: Colors.black,fontSize: 35,),numberInAndOut: NumberInAndOut.outside,counterAlign: CounterAlign.center,secondsMarker: SecondsMarker.secondsAndMinute,hand: Hand.short,),),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
child: FlutterGauge(
index: 50.0,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 25,
),
widthCircle: 10,
secondsMarker: SecondsMarker.none,
number: Number.all),
),
// Expanded(child: FlutterGauge(index: 25.0,counterStyle : TextStyle(color: Colors.black,fontSize: 25,),secondsMarker: SecondsMarker.secondsAndMinute,number: Number.all,numberInAndOut: NumberInAndOut.outside,)),
],
),
Row(
children: <Widget>[
// Expanded(child: FlutterGauge(handSize: 30,width: 200,index: 65.0,fontFamily: "Iran",end: 100,number: Number.endAndCenterAndStart,secondsMarker: SecondsMarker.secondsAndMinute,counterStyle: TextStyle(color: Colors.black,fontSize: 25,)),),
// Expanded(child: FlutterGauge(secondsMarker: SecondsMarker.none,hand: Hand.short,number: Number.none,width: 200,index: 38.0,fontFamily: "Iran",counterStyle: TextStyle(color: Colors.black,fontSize: 35),counterAlign: CounterAlign.center,isDecimal: false),),
],
),
Row(
children: <Widget>[
Expanded(
child: FlutterGauge(
handSize: 30,
width: 200,
index: 80.0,
fontFamily: "Iran",
end: 100,
number: Number.endAndCenterAndStart,
secondsMarker: SecondsMarker.secondsAndMinute,
hand: Hand.short,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 22,
)),
),
// Expanded(child: FlutterGauge(handSize: 30,width: 200,index: 65.0,fontFamily: "Iran",end: 500,number: Number.endAndStart,secondsMarker: SecondsMarker.minutes,isCircle: false,counterStyle: TextStyle(color: Colors.black,fontSize: 25,)),),
],
),
Row(
children: <Widget>[
Expanded(
child: Container(
color: Colors.black38,
child: FlutterGauge(
inactiveColor: Colors.white38,
activeColor: Colors.white,
handSize: 30,
width: 200,
index: 65.0,
fontFamily: "Iran",
end: 400,
number: Number.none,
secondsMarker: SecondsMarker.minutes,
isCircle: false,
hand: Hand.none,
counterAlign: CounterAlign.center,
counterStyle: TextStyle(
color: Colors.white,
fontSize: 30,
),
isDecimal: false,
)),
),
// Expanded(child: FlutterGauge(width: 200,index: 67.3,fontFamily: "Iran",counterStyle: TextStyle(color: Colors.black,fontSize: 35,),numberInAndOut: NumberInAndOut.outside,counterAlign: CounterAlign.center,secondsMarker: SecondsMarker.secondsAndMinute,hand: Hand.short),),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
child: FlutterGauge(
index: 50.0,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 25,
),
widthCircle: 10,
secondsMarker: SecondsMarker.none,
number: Number.all),
),
// Expanded(child: FlutterGauge(index: 25.0,counterStyle : TextStyle(color: Colors.black,fontSize: 25,),secondsMarker: SecondsMarker.secondsAndMinute,number: Number.all,numberInAndOut: NumberInAndOut.outside,)),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
child: FlutterGauge(
index: 50.0,
width: 270,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 25,
),
widthCircle: 10,
secondsMarker: SecondsMarker.none,
number: Number.all),
),
],
),
FlutterGauge(
handSize: 30,
width: 270,
index: 65.0,
fontFamily: "Iran",
end: 100,
number: Number.endAndCenterAndStart,
secondsMarker: SecondsMarker.secondsAndMinute,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 25,
)),
FlutterGauge(
index: 50.0,
width: 270,
counterStyle: TextStyle(
color: Colors.black,
fontSize: 25,
),
widthCircle: 10,
secondsMarker: SecondsMarker.none,
number: Number.all),
],
),
);
}
}
推荐阅读
- c++ - 如何在 linux 中使用 Makefile 编译 tensorflow c_api
- c# - 锁定/使用/分配内存
- twilio - 如何在 twilio 函数调用节点库中获取可用的工作人员数量?
- mysql - 无法将此案例查询从 blob 转换为文本
- javascript - 未捕获的 FirebaseError:使用无效数据调用的函数 DocumentReference.set()。不支持的字段值:未定义
- powershell - 禁用本地帐户“用户必须在下次登录时更改密码”
- vba - 如何使 .MergeShapes 行为正常?
- java - 如何在 Java 中读取/获取表情符号的 unicode 值
- swift - 通用 NSKeyValueObservedChange/Keypath
- youtube-api - 如何使用 YouTube API 将 YouTube 播放列表设置为“官方系列播放列表”?