From 3ae11796ffc1806e48fa5df2892a1567df295d0e Mon Sep 17 00:00:00 2001 From: Thijs Date: Fri, 10 Sep 2021 18:08:10 +0200 Subject: [PATCH] add feature that makes it possible to set touch on track to false --- example/lib/ui/example_page.dart | 3 +++ example/lib/ui/home_page.dart | 11 +++++++---- lib/src/circular_slider.dart | 25 +++++++++++++++++++++---- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/example/lib/ui/example_page.dart b/example/lib/ui/example_page.dart index 22843fa..9046196 100644 --- a/example/lib/ui/example_page.dart +++ b/example/lib/ui/example_page.dart @@ -7,6 +7,7 @@ class ExampleViewModel { final double min; final double max; final double value; + final bool touchOnTrack; final InnerWidget? innerWidget; ExampleViewModel( @@ -15,6 +16,7 @@ class ExampleViewModel { this.min = 0, this.max = 100, this.value = 50, + this.touchOnTrack = true, this.innerWidget}); } @@ -44,6 +46,7 @@ class ExamplePage extends StatelessWidget { appearance: viewModel.appearance, min: viewModel.min, max: viewModel.max, + touchOnTrack: viewModel.touchOnTrack, initialValue: viewModel.value, )), ), diff --git a/example/lib/ui/home_page.dart b/example/lib/ui/home_page.dart index cc70af5..1c53236 100644 --- a/example/lib/ui/home_page.dart +++ b/example/lib/ui/home_page.dart @@ -1,10 +1,12 @@ -import 'package:flutter/material.dart'; -import 'clock_page.dart'; -import 'random_value_page.dart'; -import 'package:example/utils.dart'; import 'dart:math' as math; + +import 'package:example/utils.dart'; +import 'package:flutter/material.dart'; import 'package:sleek_circular_slider/sleek_circular_slider.dart'; + +import 'clock_page.dart'; import 'example_page.dart'; +import 'random_value_page.dart'; /// Example 01 final CircularSliderAppearance appearance01 = CircularSliderAppearance(); @@ -13,6 +15,7 @@ final viewModel01 = ExampleViewModel( min: 0, max: 100, value: 60, + touchOnTrack:false, pageColors: [Colors.white, HexColor('#E1C3FF')]); final example01 = ExamplePage( viewModel: viewModel01, diff --git a/lib/src/circular_slider.dart b/lib/src/circular_slider.dart index b195d28..dba63c4 100644 --- a/lib/src/circular_slider.dart +++ b/lib/src/circular_slider.dart @@ -1,13 +1,15 @@ library circular_slider; -import 'package:flutter/material.dart'; -import 'package:flutter/gestures.dart'; +import 'dart:math' as math; + import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; import 'package:sleek_circular_slider/src/slider_animations.dart'; -import 'utils.dart'; + import 'appearance.dart'; import 'slider_label.dart'; -import 'dart:math' as math; +import 'utils.dart'; part 'curve_painter.dart'; part 'custom_gesture_recognizer.dart'; @@ -15,10 +17,12 @@ part 'custom_gesture_recognizer.dart'; typedef void OnChange(double value); typedef Widget InnerWidget(double percentage); + class SleekCircularSlider extends StatefulWidget { final double initialValue; final double min; final double max; + final bool touchOnTrack; final CircularSliderAppearance appearance; final OnChange? onChange; final OnChange? onChangeStart; @@ -35,6 +39,7 @@ class SleekCircularSlider extends StatefulWidget { this.initialValue = 50, this.min = 0, this.max = 100, + this.touchOnTrack = true, this.appearance = defaultAppearance, this.onChange, this.onChangeStart, @@ -297,6 +302,18 @@ class _SleekCircularSliderState extends State ? widget.appearance.progressBarWidth : 25.0; + if(!widget.touchOnTrack) { + Offset handlerOffset = degreesToCoordinates( + _painter!.center!, -math.pi / 2 + _startAngle + _currentAngle! + 1.5, + _painter!.radius); + if (!Rect.fromCenter( + center: position, width: touchWidth, height: touchWidth).contains( + handlerOffset)) { + return false; + } + } + + if (isPointAlongCircle( position, _painter!.center!, _painter!.radius, touchWidth)) { _isHandlerSelected = true;