34Flutter Slider滑动条

Flutter之滑动条——Slider

1.简介

Slider是Flutter中的滑动条组件,类似于Android中的SeekBar

2.属性

const Slider({
    Key key,
    @required this.value, //滑块当前位置值
    @required this.onChanged, //拖动滑块过程中持续调用
    this.onChangeStart, //滑动开始值
    this.onChangeEnd, //滑动结束值
    this.min = 0.0, //可选最小值
    this.max = 1.0, //可选最大值
    this.divisions, //分段
    this.label, //当滑块滑动时,在滑块上方显示的标签。
    this.activeColor, //滑块及左侧轨道颜色
    this.inactiveColor, //右侧轨道颜色
    this.semanticFormatterCallback,//用于根据滑块值创建语义值的回调。未验证出来有什么用
    })

3.案例

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // home: CustomScrollViewDemo(),
      home: Scaffold(
        body: Center(
          child: SliderDemo(),
        ),
      ),
    );
  }
}


class SliderDemo extends StatefulWidget {
  SliderDemo({Key key}) : super(key: key);

  @override
  _SliderDemoState createState() {
    return _SliderDemoState();
  }
}

class _SliderDemoState extends State<SliderDemo> {
  var sliderValue = 20.0;
  var sliderValue1 = 20.0;
  Widget _buildSlider() {
    return Wrap(
      children: <Widget>[
        Slider(
          value: sliderValue,
          min: 0,
          max: 100,
          onChanged: (value) {
            print("slider value1 = $value");
            //slider value1 = 0.5019047328404018
            setState(() {
              sliderValue = value;
            });
          },
        ),
        Slider(
          value: sliderValue1,
          min: 0,
          max: 100,
          activeColor: Colors.red,
          inactiveColor: Colors.blue.withAlpha(50),
          divisions: 4,
          label: "${sliderValue1 / 1}",
          semanticFormatterCallback: (value) {
            return '$sliderValue1 dollars';
          },
          onChanged: (value) {
            setState(() {
              sliderValue1 = value;
            });
          },
          onChangeStart: (value) {
            print("onChange Start = $value");
          },
          onChangeEnd: (value) {
            print("onChange End = $value");
          },
        ),
      ],
    );
  }

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

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return _buildSlider();
  }
}

4.SliderTheme

SliderTheme可以更灵活的设置滑块样式

属性含义
trackHeight滑条高度
activeTrackColor已拖动的颜色
inactiveTrackColor/未拖动的颜色
valueIndicatorColor提示进度的气泡的背景色
thumbShape滑块形状
valueIndicatorTextStyle//提示进度的气泡文本的颜色
valueIndicatorColor提示进度的气泡的背景色
thumbColor滑块中心的颜色
inactiveTickMarkColordivisions对进度线分割后,断续线中间间隔的颜色
overlayColor滑块边缘的颜色
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'SliderTheme组件',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('SliderTheme组件'),
        ),
        body: Center(child: DemoPage(),),
      ),
    );
  }
}

class DemoPage extends StatefulWidget {

  const DemoPage({Key key}) : super(key: key);

  @override
  DemoPageState createState() => DemoPageState();
}

class DemoPageState extends State<DemoPage> {

  double value = 0.0;

  @override
  Widget build(BuildContext context) {
    return SliderTheme(
      data: SliderTheme.of(context).copyWith(
        //已拖动的颜色
        activeTrackColor: Colors.greenAccent,
        //未拖动的颜色
        inactiveTrackColor: Colors.green,

        //提示进度的气泡的背景色
        valueIndicatorColor: Colors.green,
        //提示进度的气泡文本的颜色
        valueIndicatorTextStyle: TextStyle(
          color:Colors.white,
        ),
        trackHeight: 3,
        //滑块中心的颜色
        thumbColor: Colors.blueAccent,
        //滑块边缘的颜色
        overlayColor: Colors.red,

        //divisions对进度线分割后,断续线中间间隔的颜色
        inactiveTickMarkColor: Colors.white,
      ),
      child: Slider(
        value: value,
        label: '$value',
        min: 0.0,
        max: 100.0,
        divisions: 10,
        onChanged: (val){
          setState(() {
            value = val.floorToDouble();//转化成double
          });
        },
      ),
    );
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter中可以使用GestureDetector和Animation结合来实现左右滑动出现按钮的效果。 首先,使用GestureDetector来监听滑动手势。可以通过设置onHorizontalDragUpdate来获取滑动的偏移量,并通过动画控制器控制按钮的出现与隐藏。在动画控制器的动画更新里,可以通过setState来改变按钮的位置。 以下是一个示例代码: ```dart import 'package:flutter/material.dart'; class SlideButtonPage extends StatefulWidget { @override _SlideButtonPageState createState() => _SlideButtonPageState(); } class _SlideButtonPageState extends State<SlideButtonPage> with SingleTickerProviderStateMixin { Animation<double> _animation; AnimationController _animationController; double _dragOffset = 0.0; double _buttonWidth = 80.0; double _maxSlideWidth = 120.0; @override void initState() { super.initState(); _animationController = AnimationController(duration: Duration(milliseconds: 200), vsync: this); _animation = Tween<double>( begin: _buttonWidth, end: 0.0, ).animate(_animationController) ..addListener(() { setState(() {}); }); } @override void dispose() { _animationController.dispose(); super.dispose(); } void _handleDragUpdate(DragUpdateDetails details) { _dragOffset += details.delta.dx; if (_dragOffset < 0.0) { _dragOffset = 0.0; } else if (_dragOffset > _maxSlideWidth) { _dragOffset = _maxSlideWidth; } _animationController.value = _dragOffset / _maxSlideWidth; } void _handleDragEnd(DragEndDetails details) { if (_animationController.value < 0.5) { _animationController.reverse(); } else { _animationController.forward(); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Slide Button'), ), body: GestureDetector( onHorizontalDragUpdate: _handleDragUpdate, onHorizontalDragEnd: _handleDragEnd, child: Stack( children: [ Container( width: MediaQuery.of(context).size.width, height: 100.0, color: Colors.grey[300], ), Positioned( top: 0.0, right: _animation.value - _buttonWidth, child: Container( width: _buttonWidth, height: 100.0, color: Colors.red, child: Icon( Icons.delete, color: Colors.white, ), ), ), ], ), ), ); } } ``` 在这个示例中,我们使用Stack来实现按钮的叠加效果,一个是背景容器,另一个是通过Positioned来控制位置的按钮容器。通过计算dragOffset的值来更新按钮的位置,在松开手指时根据动画控制器的值来决定是否展示按钮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值