• 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