J'ai une activité montrant un aperçu de la caméra, elle doit donc être définie comme paysage uniquement. En bas (quelle que soit la rotation du périphérique), je souhaite afficher une vue de texte. J'utilise OrientationEventListener qui donne l'orientation de l'appareil à partir de sa position naturelle. Je peux mettre en œuvre une solution qui fonctionne bien sur les périphériques portrait par défaut, mais pour que cela fonctionne également sur les périphériques par défaut en mode paysage, je dois être conscient de l’exécution sur un tel périphérique. La question est donc comment le vérifier?
Réponses
Trop de publicités?Cette méthode peut aider: -
public int getDeviceDefaultOrientation() {
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
Configuration config = getResources().getConfiguration();
int rotation = windowManager.getDefaultDisplay().getRotation();
if ( ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) &&
config.orientation == Configuration.ORIENTATION_LANDSCAPE)
|| ((rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) &&
config.orientation == Configuration.ORIENTATION_PORTRAIT)) {
return Configuration.ORIENTATION_LANDSCAPE;
} else {
return Configuration.ORIENTATION_PORTRAIT;
}
}
Eh bien, vous pouvez découvrir ce que l'orientation actuelle est la façon @Urboss dit. Vous ne pouvez pas obtenir la mise en page (portrait/paysage) de cette façon, bien sûr, de sorte que vous aurez à obtenir la largeur de l'écran/hauteur de vérifier si le courant (être il a changé ou pas, mais vous avez vérifié que ;) ) est en position paysage ou portrait:
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
wPix = dm.widthPixels;
hPix = dm.heightPixels;
(donc, si la rotation est de 0, et vous obtenez paysage au-dessus de metrix, votre appareil est par défaut paysage. Si la rotation est de 90 degrés et vous êtes portrait, la valeur par défaut est également le paysage, et ainsi de suite)
Après des heures et des heures à essayer de comprendre cela. Il n'est pas possible. Cependant, la chose la plus proche que vous pouvez faire est de définir l'orientation de "NOSENSOR"
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
Ce que cela va faire est de configurer votre application à l'orientation naturelle de l'appareil. À ce stade, vous pouvez obtenir la hauteur et la largeur de l'écran à l'aide de la DisplayMetrics classe, et de calculer si vous êtes en mode paysage ou portrait. Après vous ensuite de voir si il est en mode paysage ou portrait, vous pouvez le faire
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_XXXXX);
Où XXXX est soit en mode PAYSAGE ou PORTRAIT.
Au cas où cela peut ne pas fonctionner si vous avez un clavier coulissant.
Grâce à l'excellente réponse du diyisme ci-dessus, j'ai également ajouté la logique permettant de vérifier la position d'orientation réelle (paysage à droite, portrait, paysage à gauche, portrait retourné): Voici le code:
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
//The coordinate-system is defined relative to the screen of the phone in its default orientation
int orientation = 0;
float roll=0;
float pitch=0;
switch (getWindowManager().getDefaultDisplay().getRotation()) {
case Surface.ROTATION_0:
roll=event.values[2];
pitch=event.values[1];
break;
case Surface.ROTATION_90:
roll=event.values[1];
pitch=-event.values[2];
break;
case Surface.ROTATION_180:
roll=-event.values[2];
pitch=-event.values[1];
break;
case Surface.ROTATION_270:
roll=-event.values[1];
pitch=event.values[2];
break;
}
if (pitch >= -45 && pitch < 45 && roll >= 45)
orientation = 0;
else if (pitch < -45 && roll >= -45 && roll < 45)
orientation = 1;
else if (pitch >= -45 && pitch < 45 && roll < -45)
orientation = 2;
else if (pitch >= 45 && roll >= -45 && roll < 45 )
orientation = 3;
if (m_nOrientation != orientation) { //orientation changed event
m_Inst.Debug(LOG_TAG,"onSensorChanged: orientation:" + orientation);
m_nOrientation = orientation;
// fire event for new notification, or update your interface here
}
}
Ce code est également publié ici: http://www.pocketmagic.net/?p=2847
Voici ma solution:
public class ActivityOrientationTest extends Activity {
private static final String TAG = "ActivityOrientationTest";
private int mNaturalOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
private TextView mTextView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView = (TextView)findViewById(R.id.text);
setDefaultOrientation();
}
private void setDefaultOrientation(){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
Display display;
display = getWindow().getWindowManager().getDefaultDisplay();
int rotation = display.getRotation();
int width = 0;
int height = 0;
switch (rotation) {
case Surface.ROTATION_0:
case Surface.ROTATION_180:
Log.i(TAG, "Rotation is: 0 or 180");
width = display.getWidth();
height = display.getHeight();
break;
case Surface.ROTATION_90:
case Surface.ROTATION_270:
Log.i(TAG, "Rotation is: 90 or 270");
width = display.getHeight();
height = display.getWidth();
break;
default:
break;
}
if(width > height){
Log.i(TAG, "Natural Orientation is landscape");
mTextView.setText("Natural Orientation is landscape");
mNaturalOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
Log.i(TAG, "Natural Orientation is portrait");
mNaturalOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
mTextView.setText("Natural Orientation is portrait");
}
setRequestedOrientation(mNaturalOrientation);
}
Display.getRotation () est uniquement pris en charge par les API de niveau 8 ou supérieur. Si vous devez prendre en charge des périphériques plus anciens, vous devez appeler Display.getOrientation ().