CompassActivity.java :  » Tools » android-swiss-army-knife » com » digital_and_dreams » android » swiss_army_knife » Android Open Source

Android Open Source » Tools » android swiss army knife 
android swiss army knife » com » digital_and_dreams » android » swiss_army_knife » CompassActivity.java
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;
        }
        */
    }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.