Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- : ConstraintLayout
- {
- private string _title;
- public string Title
- {
- get => _title;
- set
- {
- _title = value;
- _titleView.Text = _title;
- }
- }
- public string Time { get; set; }
- public event Action Add;
- private float _progress;
- public float Progress
- {
- get => _progress;
- set
- {
- _progress = value;
- Invalidate();
- }
- }
- private readonly TextView _titleView;
- private readonly TextView _timeView;
- private readonly Button _addButton;
- private readonly Paint _backgroundPaint;
- private readonly Paint _gradientPaint;
- private readonly Paint _indicatorPaint;
- private readonly float _edgeOffset;
- public CircleProgress(Context context) : this(context, null, 0)
- {
- }
- public CircleProgress(Context context, IAttributeSet attrs) : this(context, attrs, 0)
- {
- }
- public CircleProgress(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
- {
- base.SetWillNotDraw(false);
- base.Id = ViewCompat.GenerateViewId();
- _titleView = new TextView(Context) { Id = ViewCompat.GenerateViewId() };
- _timeView = new TextView(Context) { Id = ViewCompat.GenerateViewId() };
- _addButton = new Button(Context) { Id = ViewCompat.GenerateViewId() };
- _addButton.Click += AddButtonOnClick;
- base.AddView(_titleView);
- base.AddView(_timeView);
- base.AddView(_addButton);
- var constraintSet = new ConstraintSet();
- constraintSet.Clone(this);
- constraintSet.SetVerticalChainStyle(_titleView.Id, 0);
- constraintSet.Connect(_titleView.Id, ConstraintSet.Top, base.Id, ConstraintSet.Top, 0);
- constraintSet.Connect(_titleView.Id, ConstraintSet.Bottom, _timeView.Id, ConstraintSet.Top, 0);
- constraintSet.Connect(_titleView.Id, ConstraintSet.Start, base.Id, ConstraintSet.Start, 0);
- constraintSet.Connect(_titleView.Id, ConstraintSet.End, base.Id, ConstraintSet.End, 0);
- constraintSet.Connect(_timeView.Id, ConstraintSet.Top, _titleView.Id, ConstraintSet.Bottom, 0);
- constraintSet.Connect(_timeView.Id, ConstraintSet.Bottom, _addButton.Id, ConstraintSet.Top, 0);
- constraintSet.Connect(_timeView.Id, ConstraintSet.Start, base.Id, ConstraintSet.Start, 0);
- constraintSet.Connect(_timeView.Id, ConstraintSet.End, base.Id, ConstraintSet.End, 0);
- constraintSet.Connect(_addButton.Id, ConstraintSet.Top, _timeView.Id, ConstraintSet.Bottom, 0);
- constraintSet.Connect(_addButton.Id, ConstraintSet.Bottom, base.Id, ConstraintSet.Bottom, 0);
- constraintSet.Connect(_addButton.Id, ConstraintSet.Start, base.Id, ConstraintSet.Start, 0);
- constraintSet.Connect(_addButton.Id, ConstraintSet.End, base.Id, ConstraintSet.End, 0);
- constraintSet.ApplyTo(this);
- _edgeOffset = TypedValue.ApplyDimension(ComplexUnitType.Dip, 15, base.Resources.DisplayMetrics);
- _backgroundPaint = new Paint(PaintFlags.AntiAlias)
- {
- StrokeWidth = _edgeOffset,
- Color = Color.AliceBlue
- };
- _backgroundPaint.SetStyle(Paint.Style.Stroke);
- _gradientPaint = new Paint(PaintFlags.AntiAlias)
- {
- StrokeWidth = _edgeOffset,
- StrokeCap = Paint.Cap.Round
- };
- _gradientPaint.SetStyle(Paint.Style.Stroke);
- _indicatorPaint = new Paint(PaintFlags.AntiAlias)
- {
- Color = Color.Black,
- StrokeWidth = TypedValue.ApplyDimension(ComplexUnitType.Dip, 2f, base.Resources.DisplayMetrics)
- };
- _indicatorPaint.SetStyle(Paint.Style.Stroke);
- Progress = 50;
- _titleView.Text = "TIME LEFT";
- _timeView.Text = DateTime.Now.ToShortTimeString();
- }
- private void AddButtonOnClick(object sender, EventArgs e)
- {
- Add?.Invoke();
- }
- protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
- {
- base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
- if (_gradientPaint.Shader == null)
- {
- _gradientPaint.SetShader(new SweepGradient(Width / 2f, Height / 2f,
- new int[] { Color.Orange, Color.Violet, Color.Blue }, null));
- }
- }
- public override void Draw(Canvas canvas)
- {
- base.Draw(canvas);
- var angle = -Progress * 3.6f;
- var radius = Width / 2f - _edgeOffset;
- canvas.DrawCircle(radius + _edgeOffset, radius + _edgeOffset, (Width - 2 * _edgeOffset) / 2f, _backgroundPaint);
- canvas.DrawArc(_edgeOffset, _edgeOffset, Width - _edgeOffset, Height - _edgeOffset, 270, angle, false, _gradientPaint);
- var circleAngle = (angle + 270) * Math.PI / 180;
- canvas.DrawCircle(radius * (float)Math.Cos(circleAngle) + radius + _gradientPaint.StrokeWidth,
- radius * (float)Math.Sin(circleAngle) + radius + _gradientPaint.StrokeWidth, _edgeOffset / 2, _indicatorPaint);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement