Implemented drawing clock hands
parent
9ead83d0db
commit
07c2dd228d
|
@ -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
|
||||
{
|
|
@ -1,5 +1,4 @@
|
|||
using WatchFace.Parser.Attributes;
|
||||
using WatchFace.Parser.Elements.ActivityElements;
|
||||
using WatchFace.Parser.Elements.BasicElements;
|
||||
|
||||
namespace WatchFace.Parser.Elements
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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" />
|
||||
|
|
Loading…
Reference in New Issue