Add BoxViewClock sample
This commit is contained in:
parent
5cdd3b9f48
commit
5575578c2d
|
@ -110,7 +110,13 @@ namespace Xamarin.Forms
|
||||||
|
|
||||||
public void StartTimer (TimeSpan interval, Func<bool> callback)
|
public void StartTimer (TimeSpan interval, Func<bool> callback)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException ();
|
Timer timer = null;
|
||||||
|
timer = new Timer ((_ => {
|
||||||
|
if (!callback ()) {
|
||||||
|
timer?.Dispose ();
|
||||||
|
timer = null;
|
||||||
|
}
|
||||||
|
}), null, (int)interval.TotalMilliseconds, (int)interval.TotalMilliseconds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
|
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
|
||||||
|
<PackageReference Include="Xamarin.Forms" Version="2.4.0.38779" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -19,5 +20,6 @@
|
||||||
<ProjectReference Include="..\..\Ooui.AspNetCore\Ooui.AspNetCore.csproj" />
|
<ProjectReference Include="..\..\Ooui.AspNetCore\Ooui.AspNetCore.csproj" />
|
||||||
<ProjectReference Include="..\..\Ooui\Ooui.csproj" />
|
<ProjectReference Include="..\..\Ooui\Ooui.csproj" />
|
||||||
<ProjectReference Include="..\..\Samples\Samples.csproj" />
|
<ProjectReference Include="..\..\Samples\Samples.csproj" />
|
||||||
|
<ProjectReference Include="..\..\Ooui.Forms\Ooui.Forms.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -39,6 +39,8 @@ namespace AspNetCoreMvc
|
||||||
|
|
||||||
app.UseOoui ();
|
app.UseOoui ();
|
||||||
|
|
||||||
|
Xamarin.Forms.Forms.Init ();
|
||||||
|
|
||||||
app.UseMvc (routes => {
|
app.UseMvc (routes => {
|
||||||
routes.MapRoute (
|
routes.MapRoute (
|
||||||
name: "default",
|
name: "default",
|
||||||
|
|
|
@ -0,0 +1,130 @@
|
||||||
|
using System;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Samples
|
||||||
|
{
|
||||||
|
public class BoxViewClockSample : ISample
|
||||||
|
{
|
||||||
|
public string Title => "Xamarin.Forms BoxViewClock";
|
||||||
|
|
||||||
|
public Ooui.Element CreateElement ()
|
||||||
|
{
|
||||||
|
return new BoxViewClockPage ().CreateElement ();
|
||||||
|
}
|
||||||
|
|
||||||
|
class BoxViewClockPage : ContentPage
|
||||||
|
{
|
||||||
|
// Structure for storing information about the three hands.
|
||||||
|
struct HandParams
|
||||||
|
{
|
||||||
|
public HandParams (double width, double height, double offset) : this ()
|
||||||
|
{
|
||||||
|
Width = width;
|
||||||
|
Height = height;
|
||||||
|
Offset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double Width { private set; get; } // fraction of radius
|
||||||
|
public double Height { private set; get; } // ditto
|
||||||
|
public double Offset { private set; get; } // relative to center pivot
|
||||||
|
}
|
||||||
|
|
||||||
|
static readonly HandParams secondParams = new HandParams (0.02, 1.1, 0.85);
|
||||||
|
static readonly HandParams minuteParams = new HandParams (0.05, 0.8, 0.9);
|
||||||
|
static readonly HandParams hourParams = new HandParams (0.125, 0.65, 0.9);
|
||||||
|
|
||||||
|
BoxView[] tickMarks = new BoxView[60];
|
||||||
|
BoxView secondHand, minuteHand, hourHand;
|
||||||
|
|
||||||
|
public BoxViewClockPage ()
|
||||||
|
{
|
||||||
|
AbsoluteLayout absoluteLayout = new AbsoluteLayout ();
|
||||||
|
|
||||||
|
// Create the tick marks (to be sized and positioned later)
|
||||||
|
for (int i = 0; i < tickMarks.Length; i++) {
|
||||||
|
tickMarks[i] = new BoxView {
|
||||||
|
Color = Color.Accent
|
||||||
|
};
|
||||||
|
absoluteLayout.Children.Add (tickMarks[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the three hands.
|
||||||
|
absoluteLayout.Children.Add (hourHand =
|
||||||
|
new BoxView {
|
||||||
|
Color = Color.Accent
|
||||||
|
});
|
||||||
|
absoluteLayout.Children.Add (minuteHand =
|
||||||
|
new BoxView {
|
||||||
|
Color = Color.Accent
|
||||||
|
});
|
||||||
|
absoluteLayout.Children.Add (secondHand =
|
||||||
|
new BoxView {
|
||||||
|
Color = Color.Accent
|
||||||
|
});
|
||||||
|
|
||||||
|
Content = absoluteLayout;
|
||||||
|
|
||||||
|
// Attach a couple event handlers.
|
||||||
|
Device.StartTimer (TimeSpan.FromMilliseconds (16), OnTimerTick);
|
||||||
|
SizeChanged += OnPageSizeChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnPageSizeChanged (object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
// Size and position the 12 tick marks.
|
||||||
|
Point center = new Point (this.Width / 2, this.Height / 2);
|
||||||
|
double radius = 0.45 * Math.Min (this.Width, this.Height);
|
||||||
|
|
||||||
|
for (int i = 0; i < tickMarks.Length; i++) {
|
||||||
|
double size = radius / (i % 5 == 0 ? 15 : 30);
|
||||||
|
double radians = i * 2 * Math.PI / tickMarks.Length;
|
||||||
|
double x = center.X + radius * Math.Sin (radians) - size / 2;
|
||||||
|
double y = center.Y - radius * Math.Cos (radians) - size / 2;
|
||||||
|
AbsoluteLayout.SetLayoutBounds (tickMarks[i], new Rectangle (x, y, size, size));
|
||||||
|
|
||||||
|
tickMarks[i].AnchorX = 0.51; // Anchor settings necessary for Android
|
||||||
|
tickMarks[i].AnchorY = 0.51;
|
||||||
|
tickMarks[i].Rotation = 180 * radians / Math.PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function for positioning and sizing hands.
|
||||||
|
Action<BoxView, HandParams> Layout = (boxView, handParams) => {
|
||||||
|
double width = handParams.Width * radius;
|
||||||
|
double height = handParams.Height * radius;
|
||||||
|
double offset = handParams.Offset;
|
||||||
|
|
||||||
|
AbsoluteLayout.SetLayoutBounds (boxView,
|
||||||
|
new Rectangle (center.X - 0.5 * width,
|
||||||
|
center.Y - offset * height,
|
||||||
|
width, height));
|
||||||
|
|
||||||
|
boxView.AnchorX = 0.51;
|
||||||
|
boxView.AnchorY = handParams.Offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
Layout (secondHand, secondParams);
|
||||||
|
Layout (minuteHand, minuteParams);
|
||||||
|
Layout (hourHand, hourParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OnTimerTick ()
|
||||||
|
{
|
||||||
|
// Set rotation angles for hour and minute hands.
|
||||||
|
DateTime dateTime = DateTime.Now;
|
||||||
|
hourHand.Rotation = 30 * (dateTime.Hour % 12) + 0.5 * dateTime.Minute;
|
||||||
|
minuteHand.Rotation = 6 * dateTime.Minute + 0.1 * dateTime.Second;
|
||||||
|
|
||||||
|
// Do an animation for the second hand.
|
||||||
|
double t = dateTime.Millisecond / 1000.0;
|
||||||
|
if (t < 0.5) {
|
||||||
|
t = 0.5 * Easing.SpringIn.Ease (t / 0.5);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
t = 0.5 * (1 + Easing.SpringOut.Ease ((t - 0.5) / 0.5));
|
||||||
|
}
|
||||||
|
secondHand.Rotation = 6 * (dateTime.Second + t);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,8 @@ namespace Samples
|
||||||
{
|
{
|
||||||
static void Main (string[] args)
|
static void Main (string[] args)
|
||||||
{
|
{
|
||||||
|
Xamarin.Forms.Forms.Init ();
|
||||||
|
|
||||||
for (var i = 0; i < args.Length; i++) {
|
for (var i = 0; i < args.Length; i++) {
|
||||||
var a = args[i];
|
var a = args[i];
|
||||||
switch (args[i]) {
|
switch (args[i]) {
|
||||||
|
|
|
@ -10,8 +10,6 @@ namespace Samples
|
||||||
|
|
||||||
Page MakePage ()
|
Page MakePage ()
|
||||||
{
|
{
|
||||||
Forms.Init ();
|
|
||||||
|
|
||||||
var countLabel = new Label {
|
var countLabel = new Label {
|
||||||
Text = "0",
|
Text = "0",
|
||||||
BackgroundColor = Color.Gold,
|
BackgroundColor = Color.Gold,
|
||||||
|
|
Loading…
Reference in New Issue