Location in Mono for Android: Listing 2
The CompassView class.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using Android.Graphics;
namespace Compass
{
public class CompassView : View
{
public CompassView(Context context)
: base(context)
{
Initialize();
init();
}
public CompassView(Context context, IAttributeSet attrs) :
base(context, attrs)
{
Initialize();
init();
}
public CompassView(Context context, IAttributeSet attrs, int defStyle) :
base(context, attrs, defStyle)
{
Initialize();
init();
}
private void Initialize()
{
init();
}
private float direction = 0;
private Android.Graphics.Paint paint = new Paint(PaintFlags.AntiAlias);
private bool firstDraw;
private void init(){
paint.SetStyle(Paint.Style.Stroke);
paint.StrokeWidth = 3;
paint.Color = Color.White;
paint.TextSize = 30;
firstDraw = true;
}
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) {
SetMeasuredDimension(MeasureSpec.GetSize(widthMeasureSpec), MeasureSpec.GetSize(heightMeasureSpec));
}
protected override void OnDraw(Canvas canvas) {
int cxCompass = MeasuredWidth/2;
int cyCompass = MeasuredHeight/2;
float radiusCompass;
if(cxCompass > cyCompass){
radiusCompass = (float) (cyCompass * 0.9);
}
else{
radiusCompass = (float) (cxCompass * 0.9);
}
canvas.DrawCircle(cxCompass, cyCompass, radiusCompass, paint);
canvas.DrawRect(0, 0, MeasuredWidth, MeasuredHeight, paint);
if(!firstDraw){
canvas.DrawLine(cxCompass, cyCompass,
(float)(cxCompass + radiusCompass * Math.Sin((double)(-direction) * 3.14/180)),
(float)(cyCompass - radiusCompass * Math.Cos((double)(-direction) * 3.14/180)),
paint);
canvas.DrawText(direction.ToString(), cxCompass, cyCompass, paint);
}
}
public void updateDirection(float dir)
{
firstDraw = false;
direction = dir;
this.Invalidate();
}
}
}
About the Author
Wallace (Wally) B. McClure has authored books on iPhone programming with Mono/Monotouch, Android programming with Mono for Android, application architecture, ADO.NET, SQL Server and AJAX. He's a Microsoft MVP, an ASPInsider and a partner at Scalable Development Inc. He maintains a blog, and can be followed on Twitter.