package com.devsmart.android; import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.view.animation.Animation; import android.view.animation.DecelerateInterpolator; import android.view.animation.RotateAnimation; public class OrientationUtil implements SensorEventListener { public interface OrientationListener { public void onOrientationChanged(Side newOrientation); } public enum Side { TOP, BOTTOM, LEFT, RIGHT; } private Side mCurrentSide; private OrientationListener mListener; private SensorManager mSensorManager; @SuppressWarnings("deprecation") public OrientationUtil(Context context) { mSensorManager = (SensorManager)context.getSystemService(Activity.SENSOR_SERVICE); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); } public void setListener(OrientationListener listener){ mListener = listener; } public void stop() { mSensorManager.unregisterListener(this); } public Side getOrientation() { return mCurrentSide; } @Override protected void finalize() { stop(); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { @SuppressWarnings("unused") float azimuth = event.values[0]; // azimuth float pitch = event.values[1]; // pitch float roll = event.values[2]; // roll Side newSide = Side.TOP; if (pitch < -45 && pitch > -135) { // top side up newSide = Side.TOP; } else if (pitch > 45 && pitch < 135) { // bottom side up newSide = Side.BOTTOM; } else if (roll > 45) { // right side up newSide = Side.RIGHT; } else if (roll < -45) { // left side up newSide = Side.LEFT; } if (mListener != null && !newSide.equals(mCurrentSide)) { mListener.onOrientationChanged(newSide); mCurrentSide = newSide; } } public static Animation getRotationAnimation(Side oldside, Side newside) { RotateAnimation retval = null; if(oldside == null || newside == null){ retval = new RotateAnimation(0, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); } else { final int olddegree = toDegrees(oldside); int newdegree = toDegrees(newside); if(olddegree == 0 && newdegree == 270){ newdegree = -90; } else if(olddegree == 270 && newdegree == 0){ newdegree = 360; } retval = new RotateAnimation(olddegree, newdegree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); retval.setDuration(500); retval.setFillEnabled(true); retval.setFillAfter(true); retval.setInterpolator(new DecelerateInterpolator()); } return retval; } public static int toDegrees(Side side){ int degree = 0; switch(side){ case TOP: degree = 0; break; case RIGHT: degree = 90; break; case BOTTOM: degree = 180; break; case LEFT: degree = 270; break; } return degree; } }