Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.48 KB | None | 0 0
  1. : ConstraintLayout
  2.     {
  3.         private string _title;
  4.         public string Title
  5.         {
  6.             get => _title;
  7.             set
  8.             {
  9.                 _title = value;
  10.                 _titleView.Text = _title;
  11.             }
  12.         }
  13.  
  14.         public string Time { get; set; }
  15.         public event Action Add;
  16.  
  17.         private float _progress;
  18.         public float Progress
  19.         {
  20.             get => _progress;
  21.             set
  22.             {
  23.                 _progress = value;
  24.                 Invalidate();
  25.             }
  26.         }
  27.  
  28.         private readonly TextView _titleView;
  29.         private readonly TextView _timeView;
  30.         private readonly Button _addButton;
  31.  
  32.         private readonly Paint _backgroundPaint;
  33.         private readonly Paint _gradientPaint;
  34.         private readonly Paint _indicatorPaint;
  35.         private readonly float _edgeOffset;
  36.  
  37.         public CircleProgress(Context context) : this(context, null, 0)
  38.         {
  39.         }
  40.  
  41.         public CircleProgress(Context context, IAttributeSet attrs) : this(context, attrs, 0)
  42.         {
  43.         }
  44.  
  45.         public CircleProgress(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
  46.         {
  47.             base.SetWillNotDraw(false);
  48.             base.Id = ViewCompat.GenerateViewId();
  49.  
  50.             _titleView = new TextView(Context) { Id = ViewCompat.GenerateViewId() };
  51.             _timeView = new TextView(Context) { Id = ViewCompat.GenerateViewId() };
  52.             _addButton = new Button(Context) { Id = ViewCompat.GenerateViewId() };
  53.  
  54.             _addButton.Click += AddButtonOnClick;
  55.  
  56.             base.AddView(_titleView);
  57.             base.AddView(_timeView);
  58.             base.AddView(_addButton);
  59.  
  60.             var constraintSet = new ConstraintSet();
  61.             constraintSet.Clone(this);
  62.             constraintSet.SetVerticalChainStyle(_titleView.Id, 0);
  63.             constraintSet.Connect(_titleView.Id, ConstraintSet.Top, base.Id, ConstraintSet.Top, 0);
  64.             constraintSet.Connect(_titleView.Id, ConstraintSet.Bottom, _timeView.Id, ConstraintSet.Top, 0);
  65.             constraintSet.Connect(_titleView.Id, ConstraintSet.Start, base.Id, ConstraintSet.Start, 0);
  66.             constraintSet.Connect(_titleView.Id, ConstraintSet.End, base.Id, ConstraintSet.End, 0);
  67.             constraintSet.Connect(_timeView.Id, ConstraintSet.Top, _titleView.Id, ConstraintSet.Bottom, 0);
  68.             constraintSet.Connect(_timeView.Id, ConstraintSet.Bottom, _addButton.Id, ConstraintSet.Top, 0);
  69.             constraintSet.Connect(_timeView.Id, ConstraintSet.Start, base.Id, ConstraintSet.Start, 0);
  70.             constraintSet.Connect(_timeView.Id, ConstraintSet.End, base.Id, ConstraintSet.End, 0);
  71.             constraintSet.Connect(_addButton.Id, ConstraintSet.Top, _timeView.Id, ConstraintSet.Bottom, 0);
  72.             constraintSet.Connect(_addButton.Id, ConstraintSet.Bottom, base.Id, ConstraintSet.Bottom, 0);
  73.             constraintSet.Connect(_addButton.Id, ConstraintSet.Start, base.Id, ConstraintSet.Start, 0);
  74.             constraintSet.Connect(_addButton.Id, ConstraintSet.End, base.Id, ConstraintSet.End, 0);
  75.             constraintSet.ApplyTo(this);
  76.  
  77.             _edgeOffset = TypedValue.ApplyDimension(ComplexUnitType.Dip, 15, base.Resources.DisplayMetrics);
  78.  
  79.             _backgroundPaint = new Paint(PaintFlags.AntiAlias)
  80.             {
  81.                 StrokeWidth = _edgeOffset,
  82.                 Color = Color.AliceBlue
  83.             };
  84.  
  85.             _backgroundPaint.SetStyle(Paint.Style.Stroke);
  86.  
  87.             _gradientPaint = new Paint(PaintFlags.AntiAlias)
  88.             {
  89.                 StrokeWidth = _edgeOffset,
  90.                 StrokeCap = Paint.Cap.Round
  91.             };
  92.  
  93.             _gradientPaint.SetStyle(Paint.Style.Stroke);
  94.  
  95.             _indicatorPaint = new Paint(PaintFlags.AntiAlias)
  96.             {
  97.                 Color = Color.Black,
  98.                 StrokeWidth = TypedValue.ApplyDimension(ComplexUnitType.Dip, 2f, base.Resources.DisplayMetrics)
  99.             };
  100.  
  101.             _indicatorPaint.SetStyle(Paint.Style.Stroke);
  102.  
  103.             Progress = 50;
  104.             _titleView.Text = "TIME LEFT";
  105.             _timeView.Text = DateTime.Now.ToShortTimeString();
  106.         }
  107.  
  108.         private void AddButtonOnClick(object sender, EventArgs e)
  109.         {
  110.             Add?.Invoke();
  111.         }
  112.  
  113.         protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
  114.         {
  115.             base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
  116.             if (_gradientPaint.Shader == null)
  117.             {
  118.                 _gradientPaint.SetShader(new SweepGradient(Width / 2f, Height / 2f,
  119.                     new int[] { Color.Orange, Color.Violet, Color.Blue }, null));
  120.             }
  121.         }
  122.  
  123.         public override void Draw(Canvas canvas)
  124.         {
  125.             base.Draw(canvas);
  126.             var angle = -Progress * 3.6f;
  127.             var radius = Width / 2f - _edgeOffset;
  128.             canvas.DrawCircle(radius + _edgeOffset, radius + _edgeOffset, (Width - 2 * _edgeOffset) / 2f, _backgroundPaint);
  129.             canvas.DrawArc(_edgeOffset, _edgeOffset, Width - _edgeOffset, Height - _edgeOffset, 270, angle, false, _gradientPaint);
  130.             var circleAngle = (angle + 270) * Math.PI / 180;
  131.             canvas.DrawCircle(radius * (float)Math.Cos(circleAngle) + radius + _gradientPaint.StrokeWidth,
  132.                 radius * (float)Math.Sin(circleAngle) + radius + _gradientPaint.StrokeWidth, _edgeOffset / 2, _indicatorPaint);
  133.         }
  134.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement