From 17fdde66d94155fc62a034fa6658995bef6fd6e5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 22 Mar 2016 13:02:25 -0700 Subject: Initial import --- .../Renderers/SliderRenderer.cs | 98 ++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 Xamarin.Forms.Platform.Android/Renderers/SliderRenderer.cs (limited to 'Xamarin.Forms.Platform.Android/Renderers/SliderRenderer.cs') diff --git a/Xamarin.Forms.Platform.Android/Renderers/SliderRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/SliderRenderer.cs new file mode 100644 index 00000000..694052ef --- /dev/null +++ b/Xamarin.Forms.Platform.Android/Renderers/SliderRenderer.cs @@ -0,0 +1,98 @@ +using System.ComponentModel; +using Android.Graphics.Drawables; +using Android.OS; +using Android.Widget; + +namespace Xamarin.Forms.Platform.Android +{ + public class SliderRenderer : ViewRenderer, SeekBar.IOnSeekBarChangeListener + { + double _max; + double _min; + + public SliderRenderer() + { + AutoPackage = false; + } + + double Value + { + get { return _min + (_max - _min) * (Control.Progress / 1000.0); } + set { Control.Progress = (int)((value - _min) / (_max - _min) * 1000.0); } + } + + void SeekBar.IOnSeekBarChangeListener.OnProgressChanged(SeekBar seekBar, int progress, bool fromUser) + { + ((IElementController)Element).SetValueFromRenderer(Slider.ValueProperty, Value); + } + + void SeekBar.IOnSeekBarChangeListener.OnStartTrackingTouch(SeekBar seekBar) + { + } + + void SeekBar.IOnSeekBarChangeListener.OnStopTrackingTouch(SeekBar seekBar) + { + } + + protected override void OnElementChanged(ElementChangedEventArgs e) + { + base.OnElementChanged(e); + + if (e.OldElement == null) + { + var seekBar = new SeekBar(Context); + SetNativeControl(seekBar); + + seekBar.Max = 1000; + + seekBar.SetOnSeekBarChangeListener(this); + } + + Slider slider = e.NewElement; + _min = slider.Minimum; + _max = slider.Maximum; + Value = slider.Value; + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + Slider view = Element; + switch (e.PropertyName) + { + case "Maximum": + _max = view.Maximum; + break; + case "Minimum": + _min = view.Minimum; + break; + case "Value": + if (Value != view.Value) + Value = view.Value; + break; + } + } + + protected override void OnLayout(bool changed, int l, int t, int r, int b) + { + base.OnLayout(changed, l, t, r, b); + + BuildVersionCodes androidVersion = Build.VERSION.SdkInt; + if (androidVersion >= BuildVersionCodes.JellyBean) + { + // Thumb only supported JellyBean and higher + + if (Control == null) + return; + + SeekBar seekbar = Control; + + Drawable thumb = seekbar.Thumb; + int thumbTop = seekbar.Height / 2 - thumb.IntrinsicHeight / 2; + + thumb.SetBounds(thumb.Bounds.Left, thumbTop, thumb.Bounds.Left + thumb.IntrinsicWidth, thumbTop + thumb.IntrinsicHeight); + } + } + } +} \ No newline at end of file -- cgit v1.2.3