change position of compass needle animation so it doesn't point north
<p>I have been experimenting with the compass.java sample code in the android sdk.</p>

<p>I was wondering how I would go about changing the code so that at certain compass positions the animated object moves to a certain place other than to magnetic north.</p>

<p>e.g. when the phone is pointing south it is pointing east or west </p>

<p>when the phone is pointing east or west it points north east or north west respectively </p>

<p>Code: <a href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Compass.html" rel="nofollow">http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Compass.html</a></p>

<pre><code>package com.example.android.apis.graphics;

import android.content.Context;
import android.graphics.*;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;
import android.view.View;

public class Compass extends GraphicsActivity {

private static final String TAG = "Compass";

private SensorManager mSensorManager;
private Sensor mSensor;
private SampleView mView;
private float[] mValues;

private final SensorEventListener mListener = new SensorEventListener() {
    public void onSensorChanged(SensorEvent event) {
        if (Config.DEBUG) Log.d(TAG,
                "sensorChanged (" + event.values[0] + ", " + event.values[1] + ", " + event.values[2] + ")");
        mValues = event.values;
        if (mView != null) {
            mView.invalidate();
        }
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
};

@Override
protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
    mView = new SampleView(this);
    setContentView(mView);
}

@Override
protected void onResume()
{
    if (Config.DEBUG) Log.d(TAG, "onResume");
    super.onResume();

    mSensorManager.registerListener(mListener, mSensor,
            SensorManager.SENSOR_DELAY_GAME);
}

@Override
protected void onStop()
{
    if (Config.DEBUG) Log.d(TAG, "onStop");
    mSensorManager.unregisterListener(mListener);
    super.onStop();
}

private class SampleView extends View {
    private Paint   mPaint = new Paint();
    private Path    mPath = new Path();
    private boolean mAnimate;

    public SampleView(Context context) {
        super(context);

        // Construct a wedge-shaped path
        mPath.moveTo(0, -50);
        mPath.lineTo(-20, 60);
        mPath.lineTo(0, 50);
        mPath.lineTo(20, 60);
        mPath.close();
    }

    @Override protected void onDraw(Canvas canvas) {
        Paint paint = mPaint;

        canvas.drawColor(Color.WHITE);

        paint.setAntiAlias(true);
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.FILL);

        int w = canvas.getWidth();
        int h = canvas.getHeight();
        int cx = w / 2;
        int cy = h / 2;

        canvas.translate(cx, cy);
        if (mValues != null) {
            canvas.rotate(-mValues[0]);
        }
        canvas.drawPath(mPath, mPaint);
    }

    @Override
    protected void onAttachedToWindow() {
        mAnimate = true;
        if (Config.DEBUG) Log.d(TAG, "onAttachedToWindow. mAnimate=" + mAnimate);
        super.onAttachedToWindow();
    }

    @Override
    protected void onDetachedFromWindow() {
        mAnimate = false;
        if (Config.DEBUG) Log.d(TAG, "onDetachedFromWindow. mAnimate=" + mAnimate);
        super.onDetachedFromWindow();
    }
}
}    
</code></pre>
