• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.apis.os;
18 
19 import android.app.Activity;
20 import android.content.Context;
21 import android.os.Bundle;
22 import android.view.View;
23 import android.hardware.Sensor;
24 import android.hardware.SensorEvent;
25 import android.hardware.SensorEventListener;
26 import android.hardware.SensorManager;
27 import android.graphics.Bitmap;
28 import android.graphics.Canvas;
29 import android.graphics.Color;
30 import android.graphics.Paint;
31 import android.graphics.Path;
32 import android.graphics.RectF;
33 
34 /**
35  * <h3>Application that displays the values of the acceleration sensor graphically.</h3>
36 
37 <p>This demonstrates the {@link android.hardware.SensorManager android.hardware.SensorManager} class.
38 
39 <h4>Demo</h4>
40 OS / Sensors
41 
42 <h4>Source files</h4>
43  * <table class="LinkTable">
44  *         <tr>
45  *             <td >src/com.example.android.apis/os/Sensors.java</td>
46  *             <td >Sensors</td>
47  *         </tr>
48  * </table>
49  */
50 public class Sensors extends Activity {
51     private SensorManager mSensorManager;
52     private GraphView mGraphView;
53 
54     private class GraphView extends View implements SensorEventListener
55     {
56         private Bitmap  mBitmap;
57         private Paint   mPaint = new Paint();
58         private Canvas  mCanvas = new Canvas();
59         private Path    mPath = new Path();
60         private RectF   mRect = new RectF();
61         private float   mLastValues[] = new float[3*2];
62         private float   mOrientationValues[] = new float[3];
63         private int     mColors[] = new int[3*2];
64         private float   mLastX;
65         private float   mScale[] = new float[2];
66         private float   mYOffset;
67         private float   mMaxX;
68         private float   mSpeed = 1.0f;
69         private float   mWidth;
70         private float   mHeight;
71 
GraphView(Context context)72         public GraphView(Context context) {
73             super(context);
74             mColors[0] = Color.argb(192, 255, 64, 64);
75             mColors[1] = Color.argb(192, 64, 128, 64);
76             mColors[2] = Color.argb(192, 64, 64, 255);
77             mColors[3] = Color.argb(192, 64, 255, 255);
78             mColors[4] = Color.argb(192, 128, 64, 128);
79             mColors[5] = Color.argb(192, 255, 255, 64);
80 
81             mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
82             mRect.set(-0.5f, -0.5f, 0.5f, 0.5f);
83             mPath.arcTo(mRect, 0, 180);
84         }
85 
86         @Override
onSizeChanged(int w, int h, int oldw, int oldh)87         protected void onSizeChanged(int w, int h, int oldw, int oldh) {
88             mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
89             mCanvas.setBitmap(mBitmap);
90             mCanvas.drawColor(0xFFFFFFFF);
91             mYOffset = h * 0.5f;
92             mScale[0] = - (h * 0.5f * (1.0f / (SensorManager.STANDARD_GRAVITY * 2)));
93             mScale[1] = - (h * 0.5f * (1.0f / (SensorManager.MAGNETIC_FIELD_EARTH_MAX)));
94             mWidth = w;
95             mHeight = h;
96             if (mWidth < mHeight) {
97                 mMaxX = w;
98             } else {
99                 mMaxX = w-50;
100             }
101             mLastX = mMaxX;
102             super.onSizeChanged(w, h, oldw, oldh);
103         }
104 
105         @Override
onDraw(Canvas canvas)106         protected void onDraw(Canvas canvas) {
107             synchronized (this) {
108                 if (mBitmap != null) {
109                     final Paint paint = mPaint;
110                     final Path path = mPath;
111                     final int outer = 0xFFC0C0C0;
112                     final int inner = 0xFFff7010;
113 
114                     if (mLastX >= mMaxX) {
115                         mLastX = 0;
116                         final Canvas cavas = mCanvas;
117                         final float yoffset = mYOffset;
118                         final float maxx = mMaxX;
119                         final float oneG = SensorManager.STANDARD_GRAVITY * mScale[0];
120                         paint.setColor(0xFFAAAAAA);
121                         cavas.drawColor(0xFFFFFFFF);
122                         cavas.drawLine(0, yoffset,      maxx, yoffset,      paint);
123                         cavas.drawLine(0, yoffset+oneG, maxx, yoffset+oneG, paint);
124                         cavas.drawLine(0, yoffset-oneG, maxx, yoffset-oneG, paint);
125                     }
126                     canvas.drawBitmap(mBitmap, 0, 0, null);
127 
128                     float[] values = mOrientationValues;
129                     if (mWidth < mHeight) {
130                         float w0 = mWidth * 0.333333f;
131                         float w  = w0 - 32;
132                         float x = w0*0.5f;
133                         for (int i=0 ; i<3 ; i++) {
134                             canvas.save(Canvas.MATRIX_SAVE_FLAG);
135                             canvas.translate(x, w*0.5f + 4.0f);
136                             canvas.save(Canvas.MATRIX_SAVE_FLAG);
137                             paint.setColor(outer);
138                             canvas.scale(w, w);
139                             canvas.drawOval(mRect, paint);
140                             canvas.restore();
141                             canvas.scale(w-5, w-5);
142                             paint.setColor(inner);
143                             canvas.rotate(-values[i]);
144                             canvas.drawPath(path, paint);
145                             canvas.restore();
146                             x += w0;
147                         }
148                     } else {
149                         float h0 = mHeight * 0.333333f;
150                         float h  = h0 - 32;
151                         float y = h0*0.5f;
152                         for (int i=0 ; i<3 ; i++) {
153                             canvas.save(Canvas.MATRIX_SAVE_FLAG);
154                             canvas.translate(mWidth - (h*0.5f + 4.0f), y);
155                             canvas.save(Canvas.MATRIX_SAVE_FLAG);
156                             paint.setColor(outer);
157                             canvas.scale(h, h);
158                             canvas.drawOval(mRect, paint);
159                             canvas.restore();
160                             canvas.scale(h-5, h-5);
161                             paint.setColor(inner);
162                             canvas.rotate(-values[i]);
163                             canvas.drawPath(path, paint);
164                             canvas.restore();
165                             y += h0;
166                         }
167                     }
168 
169                 }
170             }
171         }
172 
onSensorChanged(SensorEvent event)173         public void onSensorChanged(SensorEvent event) {
174             //Log.d(TAG, "sensor: " + sensor + ", x: " + values[0] + ", y: " + values[1] + ", z: " + values[2]);
175             synchronized (this) {
176                 if (mBitmap != null) {
177                     final Canvas canvas = mCanvas;
178                     final Paint paint = mPaint;
179                     if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
180                         for (int i=0 ; i<3 ; i++) {
181                             mOrientationValues[i] = event.values[i];
182                         }
183                     } else {
184                         float deltaX = mSpeed;
185                         float newX = mLastX + deltaX;
186 
187                         int j = (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) ? 1 : 0;
188                         for (int i=0 ; i<3 ; i++) {
189                             int k = i+j*3;
190                             final float v = mYOffset + event.values[i] * mScale[j];
191                             paint.setColor(mColors[k]);
192                             canvas.drawLine(mLastX, mLastValues[k], newX, v, paint);
193                             mLastValues[k] = v;
194                         }
195                         if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
196                             mLastX += mSpeed;
197                     }
198                     invalidate();
199                 }
200             }
201         }
202 
onAccuracyChanged(Sensor sensor, int accuracy)203         public void onAccuracyChanged(Sensor sensor, int accuracy) {
204         }
205     }
206 
207     /**
208      * Initialization of the Activity after it is first created.  Must at least
209      * call {@link android.app.Activity#setContentView setContentView()} to
210      * describe what is to be displayed in the screen.
211      */
212     @Override
onCreate(Bundle savedInstanceState)213     protected void onCreate(Bundle savedInstanceState) {
214         // Be sure to call the super class.
215         super.onCreate(savedInstanceState);
216 
217         mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
218         mGraphView = new GraphView(this);
219         setContentView(mGraphView);
220     }
221 
222     @Override
onResume()223     protected void onResume() {
224         super.onResume();
225         mSensorManager.registerListener(mGraphView,
226                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
227                 SensorManager.SENSOR_DELAY_FASTEST);
228         mSensorManager.registerListener(mGraphView,
229                 mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
230                 SensorManager.SENSOR_DELAY_FASTEST);
231         mSensorManager.registerListener(mGraphView,
232                 mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
233                 SensorManager.SENSOR_DELAY_FASTEST);
234     }
235 
236     @Override
onStop()237     protected void onStop() {
238         mSensorManager.unregisterListener(mGraphView);
239         super.onStop();
240     }
241 }
242