J'ai besoin de détecter un changement d'orientation dans ma demande, mais je ne veux pas que ma mise en page soit changée du portrait au paysage. Actuellement, j'utilise le OrientationEventListener
, la détection de l'angle d'orientation ne suffit pas. Je souhaite détecter que l'utilisateur a changé de portrait au paysage ou à vicefersa, et cela ne détecte pas seulement si l'angle d'orientation est de 90 ou 270.
[.____] Je veux faire la même détection que le Android doit changer l'orientation de l'activité. J'ai essayé de remplacer onConfigurationChanged
et vérifiez si l'orientantion est un paysage/portrait, mais cela change toujours mon disposition d'activité vers le paysage.
[.____] Y a-t-il un moyen d'utiliser OnConfigurationBanged mais forcer la mise en page à rester en portrait?
Y a-t-il un autre moyen de détecter le changement d'orientation sans utiliser OrientationEventListener
. En fin de compte, je peux mettre en œuvre ma propre orientation a changé d'algorithme, toutes idées à ce sujet? Il doit être quelque chose de plus complexe que if(90-THRESHOLD <= orientation <= 90+THRESHOLD)
, je souhaite détecter si l'utilisateur a effectué le portrait de mouvement complet-> paysage ou paysage-> portrait.
Merci pour l'aide,
[.____] filipe
OK, après avoir essayé d'utiliser le Android API et de ne pas pouvoir faire ce dont j'ai besoin, j'ai mis en place mon propre algorithme et que ce n'était pas si compliqué: j'ai utilisé un orientationeventlistener et calculé si L'orientation est dans les 4 points d'orientation (dans mon code, je ne détecte que LANDSCAPE_RIGHT
et PORTRAIT_UP
:
orientationListener = new OrientationEventListener(context, SensorManager.SENSOR_DELAY_UI) {
public void onOrientationChanged(int orientation) {
if(canShow(orientation)){
show();
} else if(canDismiss(orientation)){
dismiss();
}
}
};
@Override
public void onResume(){
super.onResume();
orientationListener.enable();
}
@Override
public void onPause(){
super.onPause();
orientationListener.disable();
}
private boolean isLandscape(int orientation){
return orientation >= (90 - THRESHOLD) && orientation <= (90 + THRESHOLD);
}
private boolean isPortrait(int orientation){
return (orientation >= (360 - THRESHOLD) && orientation <= 360) || (orientation >= 0 && orientation <= THRESHOLD);
}
public boolean canShow(int orientation){
return !visible && isLandscape(orientation);
}
public boolean canDismiss(int orientation){
return visible && !dismissing && isPortrait(orientation);
}
Salut ScreamingNoises Est-ce ce que vous cherchez?
// Set background image, rotatable
View view = getWindow().getDecorView();
int orientation = getResources().getConfiguration().orientation;
if (Configuration.ORIENTATION_LANDSCAPE == orientation) {
//Do SomeThing; // Landscape
} else {
//Do SomeThing; // Portrait
}
J'ai créé la classe suivante pour détecter les changements d'orientation, en gardant mon activité Orientation originale:
public class SensorOrientationChangeNotifier {
public final String TAG = getClass().getSimpleName();
private ArrayList<WeakReference<SensorOrientationChangeNotifier.Listener>> mListeners = new ArrayList<WeakReference<SensorOrientationChangeNotifier.Listener>>(3);
private int mOrientation = 0;
private SensorEventListener mSensorEventListener;
private SensorManager mSensorManager;
private static SensorOrientationChangeNotifier mInstance;
public static SensorOrientationChangeNotifier getInstance() {
if (mInstance == null)
mInstance = new SensorOrientationChangeNotifier();
return mInstance;
}
private SensorOrientationChangeNotifier() {
mSensorEventListener = new NotifierSensorEventListener();
Context applicationContext = GlobalData.getInstance().getContext();
mSensorManager = (SensorManager) applicationContext.getSystemService(Context.SENSOR_SERVICE);
}
/**
* Call on activity reset()
*/
private void onResume() {
mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
/**
* Call on activity onPause()
*/
private void onPause() {
mSensorManager.unregisterListener(mSensorEventListener);
}
private class NotifierSensorEventListener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
int newOrientation = mOrientation;
if (x < 5 && x > -5 && y > 5)
newOrientation = 0;
else if (x < -5 && y < 5 && y > -5)
newOrientation = 90;
else if (x < 5 && x > -5 && y < -5)
newOrientation = 180;
else if (x > 5 && y < 5 && y > -5)
newOrientation = 270;
//Log.e(TAG,"mOrientation="+mOrientation+" ["+event.values[0]+","+event.values[1]+","+event.values[2]+"]");
if (mOrientation != newOrientation){
mOrientation = newOrientation;
notifyListeners();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
public int getOrientation() {
return mOrientation;
}
public interface Listener {
void onOrientationChange(int orientation);
}
public void addListener(SensorOrientationChangeNotifier.Listener listener) {
if (get(listener) == null) // prevent duplications
mListeners.add(new WeakReference<SensorOrientationChangeNotifier.Listener>(listener));
if (mListeners.size() == 1) {
onResume(); // this is the first client
}
}
public void remove(SensorOrientationChangeNotifier.Listener listener) {
WeakReference<SensorOrientationChangeNotifier.Listener> listenerWR = get(listener);
remove(listenerWR);
}
private void remove(WeakReference<SensorOrientationChangeNotifier.Listener> listenerWR) {
if (listenerWR != null)
mListeners.remove(listenerWR);
if (mListeners.size() == 0) {
onPause();
}
}
private WeakReference<SensorOrientationChangeNotifier.Listener> get(SensorOrientationChangeNotifier.Listener listener) {
for (WeakReference<SensorOrientationChangeNotifier.Listener> existingListener : mListeners)
if (existingListener.get() == listener)
return existingListener;
return null;
}
private void notifyListeners() {
ArrayList<WeakReference<SensorOrientationChangeNotifier.Listener>> deadLiksArr = new ArrayList<WeakReference<SensorOrientationChangeNotifier.Listener>>();
for (WeakReference<SensorOrientationChangeNotifier.Listener> wr : mListeners) {
if (wr.get() == null)
deadLiksArr.add(wr);
else
wr.get().onOrientationChange(mOrientation);
}
// remove dead references
for (WeakReference<SensorOrientationChangeNotifier.Listener> wr : deadLiksArr) {
mListeners.remove(wr);
}
}
public boolean isPortrait(){
return mOrientation == 0 || mOrientation == 180;
}
public boolean isLandscape(){
return !isPortrait();
}
}
Utilisez-le comme suit:
Dans androidmanifest.xml -
<activity
...
Android:screenOrientation="portrait"
>
Dans votre activité:
public class MainActivity extends Activity implements SensorOrientationChangeNotifier.Listener {
@Override
protected void onResume() {
super.onResume();
SensorOrientationChangeNotifier.getInstance().addListener(this);
}
@Override
protected void onPause() {
super.onPause();
SensorOrientationChangeNotifier.getInstance().remove(this);
}
@Override
public void onOrientationChange(int orientation) {
if (orientation == 90 || orientation == 270){
// Do some landscape stuff
} else {
// Do some portrait stuff
}
}
}
}