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.