Implemented drawing clock hands

amazfit_cor
Valeriy Mironov 2018-01-14 12:15:39 +02:00
parent 9ead83d0db
commit 07c2dd228d
5 changed files with 63 additions and 11 deletions

View File

@ -1,7 +1,6 @@
using WatchFace.Parser.Attributes;
using WatchFace.Parser.Elements.BasicElements;
namespace WatchFace.Parser.Elements.ActivityElements
namespace WatchFace.Parser.Elements.BasicElements
{
public class CompositeNumber
{

View File

@ -1,5 +1,4 @@
using WatchFace.Parser.Attributes;
using WatchFace.Parser.Elements.ActivityElements;
using WatchFace.Parser.Elements.BasicElements;
namespace WatchFace.Parser.Elements

View File

@ -1,10 +1,12 @@
using System;
using System.Drawing;
using WatchFace.Parser.Models.Elements.AnalogDial;
using System.Drawing.Imaging;
using BumpKit;
using WatchFace.Parser.Interfaces;
namespace WatchFace.Parser.Models.Elements
{
public class AnalogDialBitmapElement : ContainerElement
public class AnalogDialBitmapElement : CompositeElement, IDrawable
{
public AnalogDialBitmapElement(Parameter parameter, Element parent = null, string name = null) :
base(parameter, parent, name) { }
@ -15,14 +17,62 @@ namespace WatchFace.Parser.Models.Elements
public ImageElement Seconds { get; set; }
public ImageElement CenterImage { get; set; }
private CoordinatesElement Center { get; set; }
public void Draw(Graphics drawer, Bitmap[] resources, WatchState state)
{
if (Hours != null)
{
var angle = DegreeFromValues(state.Time.Hour % 12 + (double) state.Time.Minute / 60, 12);
var hoursImage = RotateImage(
resources[Hours.ImageIndex], new Point((int) Hours.X, (int) Hours.Y), angle
);
drawer.DrawImage(hoursImage, new Point((int) RedrawArea.X, (int) RedrawArea.Y));
}
private Point RotatePoint(CoordinatesElement element, double degrees)
if (Minutes != null)
{
var angle = DegreeFromValues(state.Time.Minute, 60);
var hoursImage = RotateImage(
resources[Minutes.ImageIndex], new Point((int)Minutes.X, (int)Minutes.Y), angle
);
drawer.DrawImage(hoursImage, new Point((int)RedrawArea.X, (int)RedrawArea.Y));
}
if (Seconds != null)
{
var angle = DegreeFromValues(state.Time.Second, 60);
var hoursImage = RotateImage(
resources[Seconds.ImageIndex], new Point((int)Seconds.X, (int)Seconds.Y), angle
);
drawer.DrawImage(hoursImage, new Point((int)RedrawArea.X, (int)RedrawArea.Y));
}
if (CenterImage != null)
drawer.DrawImage(resources[CenterImage.ImageIndex], new Point((int)CenterImage.X, (int)CenterImage.Y));
}
private static double DegreeFromValues(double value, double total)
{
return value * 360 / total - 90;
}
private Bitmap RotateImage(Image image, Point ImageCoords, double degrees)
{
var radians = degrees / 180 * Math.PI;
var x = element.X * Math.Cos(radians) + element.Y * Math.Sin(radians);
var y = element.X * Math.Sin(radians) - element.Y * Math.Cos(radians);
return new Point((int)Math.Floor(x + Center.X), (int)Math.Floor(y + Center.Y));
var sin = Math.Sin(radians);
var cos = Math.Cos(radians);
var drawBox = RedrawArea.GetBox();
var newImage = new Bitmap(drawBox.Width, drawBox.Height);
using (var graphics = Graphics.FromImage(newImage))
{
graphics.DrawImage(image, new Point(ImageCoords.X - drawBox.X, ImageCoords.Y - drawBox.Y));
}
while (degrees < 0) degrees += 360;
while (degrees > 360) degrees -= 360;
var rotated = newImage.Rotate(degrees);
rotated.Save("tmp.png");
return rotated as Bitmap;
}
protected override Element CreateChildForParameter(Parameter parameter)

View File

@ -15,6 +15,7 @@ namespace WatchFace.Parser.Models.Elements
public StatusElement Status { get; set; }
public BatteryElement Battery { get; set; }
public AnalogDialElement AnalogDial { get; set; }
public AnalogDialBitmapElement AnalogDialBitmap { get; set; }
protected override Element CreateChildForParameter(Parameter parameter)
{
@ -47,6 +48,9 @@ namespace WatchFace.Parser.Models.Elements
case 10:
AnalogDial = new AnalogDialElement(parameter);
return AnalogDial;
case 12:
AnalogDialBitmap = new AnalogDialBitmapElement(parameter);
return AnalogDialBitmap;
default:
return base.CreateChildForParameter(parameter);
}

View File

@ -51,7 +51,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Elements\Activity.cs" />
<Compile Include="Elements\ActivityElements\CompositeNumber.cs" />
<Compile Include="Elements\BasicElements\CompositeNumber.cs" />
<Compile Include="Elements\ActivityElements\FormattedNumber.cs" />
<Compile Include="Elements\AnalogDialVector.cs" />
<Compile Include="Elements\Background.cs" />