public JoystickSeekBar(Context context, IAttributeSet attrs) : base(context, attrs)
        {
            var attributes = context.Theme.ObtainStyledAttributes(attrs, Resource.Styleable.JoystickSeekBar, 0, 0);

            _min = attributes.GetFloat(Resource.Styleable.JoystickSeekBar_jsb_min, (float)DefaultMin);
            _max = attributes.GetFloat(Resource.Styleable.JoystickSeekBar_jsb_max, (float)DefaultMax);

            if (_min > _max)
            {
                throw new AndroidRuntimeException("Attribute jsb_min must be less than attribute jsb_max");
            }

            Min      = (int)_min;
            Max      = (int)_max;
            Progress = (int)(((_max - _min) * 0.5) + _min);

            _eventTimer.Elapsed += (o, e) =>
            {
                DeltaProgressChanged?.Invoke(this, new DeltaChangedEventArgs()
                {
                    DeltaProgress = _deltaProgress
                });
            };

            _eventTimer.Interval = DefaultDeltaIntervalMillis;

            ProgressChanged    += JoystickSeekBar_ProgressChanged;
            StartTrackingTouch += JoystickSeekBar_StartTrackingTouch;
            StopTrackingTouch  += JoystickSeekBar_StopTrackingTouch;
        }
        public JoystickSlider()
        {
            if (Minimum >= Maximum)
            {
                throw new Exception("Minimum must be less than Maximum!");
            }

            Value = (((Maximum - Minimum) * 0.5) + Minimum);

            _eventTimer.Elapsed += (o, e) =>
            {
                DeltaProgressChanged?.Invoke(this, new DeltaChangedEventArgs()
                {
                    DeltaProgress = _deltaProgress
                });
            };

            _eventTimer.Interval = DefaultDeltaIntervalMillis;

            ValueChanged  += JoystickValueChanged;
            DragStarted   += JoystickDragStarted;
            DragCompleted += JoystickDragCompleted;
        }