Compas
Create new Android ProjectProject Name: Compas//tested from 2.3.3 to current android sdk
Build Target: Android 2.3.3 //or greater than thatApplication Name: CompasPackage Name: com.shaikhhamadali.blogspot.compasCreate activity file: Compas
Build Target: Android 2.3.3 //or greater than thatApplication Name: CompasPackage Name: com.shaikhhamadali.blogspot.compasCreate activity file: Compas
1.code of activity:
package com.shaikhhamadali.blogspot.compass; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.View; public class Compas extends Activity implements SensorEventListener { //declare Variables Float azimut; CustomDrawableView mCustomDrawableView;// View to draw a compass //SensorManager lets you access the device's sensors private SensorManager mSensorManager; Sensor accelerometer; Sensor magnetometer; public class CustomDrawableView extends View { Paint paint = new Paint(); public CustomDrawableView(Context context) { super(context); //color paint.setColor(0xff00ff00); //style paint.setStyle(Style.STROKE); //stroke width paint.setStrokeWidth(2); //antiAlias paint.setAntiAlias(true); //text size paint.setTextSize(30); }; protected void onDraw(Canvas canvas) { //declare Local Variables int width = getWidth(); int height = getHeight(); int centerx = width/2; int centery = height/2; // Rotate the canvas with the azimut if (azimut != null) //Preconcat the current matrix with the specified rotation. canvas.rotate(-azimut*360/(2*3.14159f), centerx, centery); //set color paint.setColor(0xff0000ff); //draw two lines canvas.drawLine(centerx, -1000, centerx, +1000, paint); canvas.drawLine(-1000, centery, 1000, centery, paint); //E,W,N,S directions canvas.drawText("N", centerx+15, centery-220, paint); canvas.drawText("S", centerx-30, centery+225, paint); canvas.drawText("E", centerx+215, centery-20, paint); canvas.drawText("W", centerx-220, centery+35, paint); } } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mCustomDrawableView = new CustomDrawableView(this); setContentView(mCustomDrawableView); //create instance of sensor manager and get system service to interact with Sensor mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); } protected void onResume() { super.onResume(); // Register the sensor listeners mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI); mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI); } protected void onPause() { super.onPause(); // unRegister the sensor listeners mSensorManager.unregisterListener(this); } public void onAccuracyChanged(Sensor sensor, int accuracy) { } float[] mGravity; float[] mGeomagnetic; public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values; if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values; if (mGravity != null && mGeomagnetic != null) { float R[] = new float[9]; float I[] = new float[9]; /*Computes the inclination matrix I as well as the rotation matrix R transforming a vector from the device coordinate * system to the world's coordinate system which is defined as a direct orthonormal basis*/ boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); if (success) { float orientation[] = new float[3]; /*Computes the device's orientation based on the rotation matrix*/ SensorManager.getOrientation(R, orientation); azimut = orientation[0]; // orientation contains: azimut, pitch and roll } } mCustomDrawableView.invalidate(); } }
3. note that:
- you can use TYPE_MAGNETIC and TYPE_ACCELEROMETER sensor to create compass and for anything etc
- must unregister Sensor on pause and register on resume.
- Learn More About Barometer
- Learn more about Sensors and multiple types of sensors.
- Learn about how to get device Sensor List.
- Learn about use Of Type Accelerometer Sensor.
- Learn about use of Type Proximity Sensor.
4. conclusion:
- Some information about how to use TYPE_MAGNETIC and TYPE_ACCELEROMETER.
- know what are Sensors and how to use Sensors.
5. About the post:
- The code seems to explain itself due to comments, but if you have any questions you can freely ask too!
- Don’t mind to write a comment whatever you like to ask, to know,to suggest or recommend.
- Hope you enjoy it!
6. Source Code:
you can download the source code GoogleDrive, Github
Cheers,
Hamad Ali Shaikh
- The code seems to explain itself due to comments, but if you have any questions you can freely ask too!
- Don’t mind to write a comment whatever you like to ask, to know,to suggest or recommend.
- Hope you enjoy it!
you can download the source code GoogleDrive, Github