首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何像flutter中提供的照片中那样使用带箭头的仪表构建小部件

如何像flutter中提供的照片中那样使用带箭头的仪表构建小部件
EN

Stack Overflow用户
提问于 2018-07-15 04:03:08
回答 1查看 1.7K关注 0票数 3

我想创建一个小部件,将在这张照片中描述

我已经创建了计时器条,但我仍然不知道如何从开始到结束添加数字,并在底部添加一个箭头,在那里你有什么点,上面有相同的颜色

代码语言:javascript
复制
child: Row(children: <Widget>[
        Column(children: <Widget>[
            Padding(
              padding: EdgeInsets.all(5.0),
              child: Container(
                decoration: new BoxDecoration(
                  border: new Border(right: BorderSide(color: Colors.black))
                ),
                child: Column(
                        children: <Widget>[
                          Text('Points'),
                          Text('38'),
                        ],
                      ),
              ),
            ),

        ],),
        // green bar
        Column(children: <Widget>[
          Padding(
            padding: EdgeInsets.only(right:10.0),
            child: Container(
              width:ratewidth,
              decoration: new BoxDecoration(
                    border: new Border(bottom: BorderSide(color: Colors.green, width: 5.0))
                  ),
            ),
          )

        ],),
        //yellow bar
        Column(children: <Widget>[
          Padding(
            padding: EdgeInsets.only(right:10.0),
            child: Container(
              width:ratewidth,
              decoration: new BoxDecoration(
                    border: new Border(bottom: BorderSide(color: Colors.yellow, width: 5.0))
                  ),
            ),
          ),
        ],),

        ...

      ],)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-15 05:17:01

结合使用RowColumnAlign,只需几行代码即可完成。

最难的部分实际上是三角形。通常,您会希望对三角形使用CustomPainter,但我在这里很懒。所以我组合了平移,旋转和剪辑。

代码语言:javascript
复制
import 'dart:math';

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHome(),
    );
  }
}

class MyHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: ScoreMeter(
              score: 1,
            ),
          )
        ],
      ),
    );
  }
}

class ScoreMeter extends StatelessWidget {
  final int score;

  ScoreMeter(
      {
      this.score,
      Key key})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: 100.0,
      child: Row(
        children: <Widget>[
          Expanded(
            child: ScoreMeterItem(
                score: score, color: Colors.green, minRange: 0, maxRange: 50),
          ),
          Expanded(
            child: ScoreMeterItem(
                score: score,
                color: Colors.yellow,
                minRange: 51,
                maxRange: 100),
          ),
          Expanded(
            child: ScoreMeterItem(
                score: score,
                color: Colors.orange,
                minRange: 101,
                maxRange: 150),
          ),
          Expanded(
            child: ScoreMeterItem(
                score: score, color: Colors.red, minRange: 151, maxRange: 200),
          ),
          Expanded(
            child: ScoreMeterItem(
                score: score,
                color: Colors.purple,
                minRange: 201,
                maxRange: 250),
          ),
          Expanded(
            child: ScoreMeterItem(
                score: score,
                color: Colors.brown,
                minRange: 251,
                maxRange: 300),
          ),
        ],
      ),
    );
  }
}

class ScoreMeterItem extends StatelessWidget {
  /// Hello World
  final int score;
  final Color color;
  final int minRange;
  final int maxRange;

  ScoreMeterItem(
      {this.score,
      this.color = Colors.grey,
      @required this.minRange,
      @required this.maxRange,
      Key key})
      : assert(minRange != null),
        assert(maxRange != null),
        super(key: key);

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 4.0),
      child: Column(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Text(minRange.toString(), style: theme.textTheme.caption),
              Text(maxRange.toString(), style: theme.textTheme.caption),
            ],
          ),
          ScoreMeterBar(color: color),
          score >= minRange && score <= maxRange
              ? SizedBox(
                  height: 10.0,
                  child: Align(
                    alignment: Alignment(
                        (score - minRange) / (maxRange - minRange) * 2 - 1,
                        0.0),
                    child: Arrow(color: color),
                  ),
                )
              : SizedBox()
        ],
      ),
    );
  }
}

class Arrow extends StatelessWidget {
  final Color color;

  Arrow({this.color});

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: 5.0,
      width: 10.0,
      child: ClipRect(
        child: OverflowBox(
          maxWidth: 10.0,
          maxHeight: 10.0,
          child: Align(
            alignment: Alignment.topCenter,
            child: Transform.translate(
              offset: Offset(.0, 5.0),
              child: Transform.rotate(
                angle: pi / 4,
                child: Container(
                  width: 10.0,
                  height: 10.0,
                  color: color,
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

class ScoreMeterBar extends StatelessWidget {
  final Color color;

  ScoreMeterBar({this.color = Colors.grey, Key key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 8.0,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.all(
          Radius.circular(4.0),
        ),
        color: color,
      ),
    );
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51342944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档