ساخت RangeSlider متریال در فلاتر
در ورژن ۱٫۷ فریمورک فلاتر ویجت جدیدو جالبی به نام RangeSlider را معرفی کرد که به کاربر امکان این را میدهد بین دو رنج مقدار مختلف انتخاب انجام دهد.
مانند وب سایت های فروشگاهی که میتوانید رنج قیمت محصولات و فیلتر گذاری کنید تا نتایج بهتری را مشاهده کنید.
در این مطلب نحوه استفاده از کامپوننت متریال دیزاین RangeSlider و همچنین چگونگی شخصی سازی آن را باهم بررسی میکنیم.
بخش های ویجت RangeSlider
ویجت range slider دارای دو نقطه مهم می باشد که کمترین و بیشترین مقدار رنج را مشخص می کند. در واقع ابتدا باید بازه مقدار را مشخص کنیم.
در تصویر زیر بخش های اصلی RangeSlider را مشاهده می کنید.
- مسیر و حد فاصل بین دو نقطه
- تیک مارک, در اسلایدر هایی که بخش بخش هستند.
- دکمه هایی که هم بصورت تکی و هم به صورت دوتایی برای تعیین بیشترین و کمترین مقدار استفاده می شود.
- مقدار شاخص که به همراه یک برچسب نمایش داده می شود.
- افکت ریپل که موقع لمس کردن نمایش داده می شود.
مقدار ا نتخابی range slider در یک state ذخیره میشه و با هر بار صدا زدن متد onChange() این مقدار آپدیت می شود.
پس برای استفاده از آن باید یک statefullwidget داشته باشیم.
RangeValues _values = RangeValues(0.3, 0.7);
RangeSlider(
values: _values,
onChanged: (RangeValues values) {
setState(() {
_values = values;
});
},
);
برای شخصی سازی شکل رنج بار باید بدونید که این ویجت از RenderBox استفاده میکنه که تمام ۵ قسمت مختلف ویجت توسط این ویژگی ساخته می شود.
برای مثال اگر میخواهید شکل دکمه های رنج اسلایدر را در فلاتر تغییر بدید میتونید از کد زیر کمک بگیرید.
class _CustomRangeThumbShape extends RangeSliderThumbShape {
static const double _thumbSize = 4.0;
@override
Size getPreferredSize(bool isEnabled, bool isDiscrete) ()=> _thumbSize;
@override
void paint(
PaintingContext context,
Offset center, {
@required Animation<double> activationAnimation,
@required Animation<double> enableAnimation,
bool isDiscrete = false,
bool isEnabled = false,
bool isOnTop,
@required SliderThemeData sliderTheme,
TextDirection textDirection,
Thumb thumb,
}) {
final Canvas canvas = context.canvas;
Path thumbPath;
switch (textDirection) {
case TextDirection.rtl:
switch (thumb) {
case Thumb.start:
thumbPath = _rightTriangle(_thumbSize, center);
break;
case Thumb.end:
thumbPath = _leftTriangle(_thumbSize, center);
break;
}
break;
case TextDirection.ltr:
switch (thumb) {
case Thumb.start:
thumbPath = _leftTriangle(_thumbSize, center);
break;
case Thumb.end:
thumbPath = _rightTriangle(_thumbSize, center);
break;
}
break;
}
canvas.drawPath(thumbPath, Paint()..color = sliderTheme.thumbColor);
}
}
Path _rightTriangle(double size, Offset thumbCenter, {bool invert = false}) {
final Path thumbPath = Path();
final double halfSize = size / 2.0;
final double sign = invert ? -1.0 : 1.0;
thumbPath.moveTo(thumbCenter.dx + halfSize * sign, thumbCenter.dy);
thumbPath.lineTo(thumbCenter.dx - halfSize * sign, thumbCenter.dy - size);
thumbPath.lineTo(thumbCenter.dx - halfSize * sign, thumbCenter.dy + size);
thumbPath.close();
return thumbPath;
}
Path _leftTriangle(double size, Offset thumbCenter) ()=>_rightTriangle(size, thumbCenter, invert: true);
در کد بالا از طریق بازنویسی متد Paint امکان پیاده سازی طراحی های مختلف را خواهید داشت و دست شما در این زمینه کاملا بازخواهد بود. کلاس Canvas در اکثر زبان های برنامه نویسی وجود دارد و وظیفه آن پیاده سازی طراحی های دو بعدی برروی صفحه است که در این متد یک نمونه از این کلاس ایجاد میکنیم و با کمک متد drawPath طراحی انجام شده را ثبت میکنیم.
حالا طراحی خودتون باید داخل SliderThemeData قرار دهید.
SliderTheme(
data: SliderThemeData(
rangeThumbShape: _CustomRangeThumbShape(),
// ...
),
child: RangeSlider(
// ...
),
),
به این شکل از ویجت مورد نظر میتوانید استفاده کنید.
مقاله: آموزش کار با تصاویر در فلاتر
دیدگاهتان را بنویسید