Hi All,

I've been using SensorManager with Sensor.TYPE_ORIENTATION for its
pitch/roll values. I want to update the code to support multiple
screen orientations (and while I'm at it get rid of some deprecated
code).

My current solution is below. The main problem with it, is that if I
set the phone down on the table, the roll does not go to 0. With some
phones, it stays were it last was before being set down. With others,
it fluctuates (noticeably) around some value.

I've tried looking for the deprecated source in the Android git
source, but could not find exactly where things were being stabilized.
Any help would be appreciated! Maybe somebody at Google could post the
deprecated code?
(please excuse the messy/unoptimized code below:)
        public void onSensorChanged( SensorEvent event )
        {
                switch( event.sensor.getType() )
                {
                        case Sensor.TYPE_ACCELEROMETER:
                                if( gravity == null )
                                        gravity = event.values.clone();
                                // would it help to calculate alpha
every time?
                                final float alpha = 0.8f;
                                gravity[0] = alpha * gravity[0] + (1 - alpha) * 
event.values[0];
                                gravity[1] = alpha * gravity[1] + (1 - alpha) * 
event.values[1];
                                gravity[2] = alpha * gravity[2] + (1 - alpha) * 
event.values[2];
                                boolean b = SensorManager.getRotationMatrix( R, 
null, gravity,
geomagnetic );
                                if( b )
                                {
                                        switch( rotation )
                                        {
                                                case Surface.ROTATION_0:
                                                case Surface.ROTATION_180:
                                                        
SensorManager.remapCoordinateSystem( R,
SensorManager.AXIS_MINUS_X, SensorManager.AXIS_Z, outR );
                                                        break;
                                                case Surface.ROTATION_90:
                                                case Surface.ROTATION_270:
                                                        
SensorManager.remapCoordinateSystem( R, SensorManager.AXIS_Z,
SensorManager.AXIS_X, outR );
                                                        break;
                                        }
                                        SensorManager.getOrientation( outR,
values );
                                        roll = (float) Math.toDegrees( 
values[2] );
                                }
                                break;
                        case Sensor.TYPE_MAGNETIC_FIELD:
                                geomagnetic = event.values.clone();
                                break;
                }
}

Thanks!
-Sheado

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to