title: Android Accelerometer moving ball
body: <p>i  have done developed a sample application with the help of tutorials posted on web. my aim is to access the accelerometer and move a ball as per the phone orientation. i was successful to certail extent. But i have two isses</p>
  
  <ol>
  <li>the ball is going out of bound of the screen</li>
  <li>the ball movement is not smooth ( looks it disappears and re appears on the screen)</li>
  </ol>
  
  <p>here is my code. is there any change i need to do to get the smooth and exact movement of the ball as we see in lot of games.</p>
  
  <pre><code>public class Accelerometer extends Activity implements SensorEventListener{
      /** Called when the activity is first created. */
      CustomDrawableView mCustomDrawableView = null;
      ShapeDrawable mDrawable = new ShapeDrawable();
      public static int x;
      public static int y;
         private Bitmap mBitmap;
         private Bitmap mWood;
      private SensorManager sensorManager = null;
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState)
      {
  
          super.onCreate(savedInstanceState);
          // Get a reference to a SensorManager
          sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
          mCustomDrawableView = new CustomDrawableView(this);
          setContentView(mCustomDrawableView);
          // setContentView(R.layout.main);
  
      }
  
      // This method will update the UI on new sensor events
      public void onSensorChanged(SensorEvent sensorEvent)
      {
          {
             /* if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                  // the values you were calculating originally here were over 10000!
                  x = (int) Math.pow(sensorEvent.values[0], 2); 
                  y = (int) Math.pow(sensorEvent.values[1], 2);
  
              }*/
  
              if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
                    Display display = getWindowManager().getDefaultDisplay(); 
                    int xmax = display.getWidth();
                    int ymax = display.getHeight();
                    x = (int) Math.pow(sensorEvent.values[1], 2); 
                    y = (int) Math.pow(sensorEvent.values[2], 2);
                    if (x &gt; xmax) {
                        x = xmax;
                    } else if (x &lt; -xmax) {
                        x = -xmax;
                    }
                    if (y &gt; ymax) { 
                        y = ymax;
                    } else if (y &lt; -ymax) {
                        y = -ymax;
                    }
  
              }
          }
      }
  
      // I've chosen to not implement this method
      public void onAccuracyChanged(Sensor arg0, int arg1)
      {
          // TODO Auto-generated method stub
  
      }
  
      @Override
      protected void onResume()
      {
          super.onResume();
          // Register this class as a listener for the accelerometer sensor
          sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                  SensorManager.SENSOR_DELAY_GAME);
          // ...and the orientation sensor
          sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                  SensorManager.SENSOR_DELAY_NORMAL); 
      }
  
      @Override
      protected void onStop()
      {
          // Unregister the listener
          sensorManager.unregisterListener(this);
          super.onStop();
      }
  
      public class CustomDrawableView extends View
      {
  
  
          public CustomDrawableView(Context context)
          {
              super(context);
  
            Bitmap ball = BitmapFactory.decodeResource(getResources(), R.drawable.ball);
            final int dstWidth = 50; 
            final int dstHeight = 50; 
            mBitmap = Bitmap.createScaledBitmap(ball, dstWidth, dstHeight, true);
            mWood = BitmapFactory.decodeResource(getResources(), R.drawable.wood);
  
          }
  
          protected void onDraw(Canvas canvas)
          {
  
              final Bitmap bitmap = mBitmap;
  
              canvas.drawBitmap(mWood, 0, 0, null);
              canvas.drawBitmap(bitmap, x, y, null);
  
              invalidate();
          }
      }
  }
  </code></pre>