package com.digital_and_dreams.android.swiss_army_knife;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
public class CompassActivity extends BaseActivity implements SensorEventListener {
static final String TAG = "SwissArmy|Compass";
private int density = 160;
DisplayMetrics metrics = null;
private float compassDegrees = 30.0f;
private float lastCompassDegrees = -1.0f;
private SensorManager mSensorManager;
private CompassView mView;
private Handler mHandler;
private CompassView compassView;
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
Log.d(TAG, "onAccuracyChanged");
}
private Runnable mRunnable = new Runnable() {
public void run() {
mHandler.postDelayed(this, 100);
if (lastCompassDegrees != compassDegrees) {
compassView.invalidate();
}
}
};
public void onSensorChanged(SensorEvent event) {
synchronized (this) {
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
final float x = event.values[1];
final float y = event.values[2];
final float z = event.values[0];
//String s = "x: " + x + "; y: " + y + "; z: " + z;
//Log.d(TAG, s);
compassDegrees = z;
}
}
}
@Override
protected void onResume()
{
super.onResume();
Sensor orientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
if (orientation != null) {
mSensorManager.registerListener(this,
orientation,
SensorManager.SENSOR_DELAY_NORMAL,
null);
mHandler.postDelayed(mRunnable, 100);
}
}
@Override
protected void onStop()
{
mSensorManager.unregisterListener(this);
super.onStop();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//requestWindowFeature(Window.FEATURE_NO_TITLE);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mView = new CompassView(this);
setContentView(mView);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.flags = LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(lp);
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
density = metrics.densityDpi;
Display display = getWindowManager().getDefaultDisplay();
//Log.d(TAG, "densityDpi: " + density + " " + width + "x" + height + " xdpi: " + metrics.xdpi + " ydpi: " + metrics.ydpi);
compassView = new CompassView(this);
setContentView(compassView);
mHandler = new Handler();
}
public class CompassView extends View {
private int mWidth;
private int mHeight;
private float mX;
float mRadius, mRadius2;
//private Bitmap mBackgroundBitmap;
//private Canvas mCanvas;
private Paint mPaint;
public CompassView(Context c) {
super(c);
mPaint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
//canvas.drawColor(0xFFAAAAAA);
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(2);
canvas.translate(mX, mX + 30);
canvas.drawArc(new RectF(-mRadius, -mRadius, mRadius, mRadius), 0, 360, false, mPaint);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.FILL);
// ***********************************************************************************
canvas.rotate(-90);
float radius = mRadius;
mPaint.setARGB(100, 255, 255, 200);
if (compassDegrees < 180) {
canvas.drawArc(new RectF(-radius, -radius, radius, radius), 0, -compassDegrees, true, mPaint);
} else {
canvas.drawArc(new RectF(-radius, -radius, radius, radius), 0, 360 - compassDegrees, true, mPaint);
}
mPaint.setStyle(Paint.Style.STROKE);
canvas.rotate(90);
// ***********************************************************************************
mPaint.setColor(Color.WHITE);
/*
float x1, x2, y1, y2;
float step = (float)((2 * Math.PI) / (360 / 10));
for (int i = 0; i < 360 / 10; i++) {
float r = step * i;
float dl = 6;
if (i % 3 == 0) {
dl = 10;
}
x1 = FloatMath.cos(r) * (mRadius + 3);
y1 = - FloatMath.sin(r) * (mRadius + 3);
x2 = FloatMath.cos(r) * (mRadius + dl);
y2 = - FloatMath.sin(r) * (mRadius + dl);
canvas.drawLine(x1, y1, x2, y2, mPaint);
}
*/
canvas.rotate(-90);
for (int i = 0; i < 360 / 10; i++) {
if (i % 3 == 0) {
canvas.drawLine(mRadius + 3, 0, mRadius + 10, 0, mPaint);
} else {
canvas.drawLine(mRadius + 3, 0, mRadius + 6, 0, mPaint);
}
canvas.rotate(10);
}
// degrees labels
mPaint.setStrokeWidth(1);
mPaint.setTextAlign(Paint.Align.CENTER);
mPaint.setTextSize(15);
canvas.rotate(90);
for (int i = 0; i < 360 / 30; i++) {
canvas.drawText("" + i * 30, 0, - (mRadius + 15), mPaint);
canvas.rotate(30);
}
canvas.rotate(-90);
//compassDegrees = 35f;
canvas.rotate(-compassDegrees);
for (int i = 0; i < 360 / 10; i++) {
mPaint.setStrokeWidth(2);
if (i == 0) {
canvas.drawLine(mRadius2, 0, mRadius2 + 15, 0, mPaint);
}
if (i % 3 == 0) {
canvas.drawLine(mRadius2, 0, mRadius2 + 8, 0, mPaint);
} else {
mPaint.setStrokeWidth(1);
canvas.drawLine(mRadius2, 0, mRadius2 + 4, 0, mPaint);
}
canvas.rotate(10);
}
canvas.rotate(90);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setTextSize(30);
mPaint.setTypeface(Typeface.DEFAULT_BOLD);
mPaint.setARGB(255, 220, 0, 0);
canvas.drawText("N", 0, - (mRadius2 - 40), mPaint);
canvas.rotate(-90);
mPaint.setColor(Color.WHITE);
canvas.drawText("W", 0, - (mRadius2 - 40), mPaint);
canvas.rotate(-90);
canvas.drawText("S", 0, - (mRadius2 - 40), mPaint);
canvas.rotate(-90);
canvas.drawText("E", 0, - (mRadius2 - 40), mPaint);
canvas.rotate(-180);
canvas.rotate(compassDegrees);
lastCompassDegrees = compassDegrees;
}
@Override
protected void onSizeChanged(int w, int h, int ow, int oh) {
Log.d(TAG, "onSizeChanged");
super.onSizeChanged(w, h, ow, oh);
mWidth = w;
mHeight = h;
mX = w * 0.5f; // remember the center of the screen
mRadius = (mWidth * 0.75f) / 2;
mRadius2 = (mWidth * 0.65f) / 2;
}
/*
@Override
public boolean onTouchEvent(MotionEvent event) {
invalidate();
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//invalidate();
break;
case MotionEvent.ACTION_MOVE:
//invalidate();
break;
case MotionEvent.ACTION_UP:
//invalidate();
break;
}
return true;
}
*/
}
}
|