Est-il possible de détecter l'orientation actuelle d'un appareil Android sans programmer un auditeur et sans manipuler la matrice de positions? Dans mon application, je souhaite uniquement connaître l'orientation actuelle - verticale ou horizontale - pour le moment. Cependant, je ne veux pas écouter les événements d'axiométrie ou d'autres événements.
Utilisez la méthode getRotation
:
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
De la documentation:
Renvoie la rotation de l'écran à partir de son orientation "naturelle". La valeur renvoyée peut être
Surface.ROTATION_0
(pas de rotation),Surface.ROTATION_90
,Surface.ROTATION_180
ouSurface.ROTATION_270
. Par exemple, si un périphérique a un grand écran et que l'utilisateur l'a tourné sur le côté pour passer en orientation paysage, la valeur renvoyée ici peut êtreSurface.ROTATION_90
ouSurface.ROTATION_270
, en fonction de la direction dans laquelle il a été tourné. L'angle est la rotation des graphiques dessinés sur l'écran, qui est le sens opposé à la rotation physique de l'appareil. Par exemple, si vous faites pivoter le périphérique de 90 degrés dans le sens inverse des aiguilles d'une montre, le rendu sera pivoté de 90 degrés dans le sens des aiguilles d'une montre; la valeur renvoyée ici sera doncSurface.ROTATION_90
.
Gardez à l'esprit que getRotation
a été introduit à partir d'Android 2.2. Utilisez getOrientation
si votre cible est constituée de périphériques plus anciens.
Vous pouvez aussi utiliser:
getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE
Il y a un article de Nice sur ce sujet qui est à lire: Un tour d’écran mérite un autre
Vous avez juste besoin de connaître la hauteur et la largeur de votre toile ... votre surface ... votre moniteur ... etc.
peut-être que vous pouvez l'obtenir avec:
if (canvas.getHeight()>canvas.getWidth() ) {
//portrait
}
else
{
//landscape
}
Vous pouvez créer une fonction d'extension à partir du code ci-dessus:
fun AppCompatActivity.getRotation(): Int{
val display = (baseContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay
val rotation = display.rotation
when(rotation){
Surface.ROTATION_90 -> return R.integer.LANDSCAPE
Surface.ROTATION_270 -> return R.integer.LANDSCAPE
Surface.ROTATION_180 -> return R.integer.PORTRAIT
Surface.ROTATION_0 -> return R.integer.PORTRAIT
else ->
return R.integer.PORTRAIT
}
}
Dans votre répertoire de ressources, créez un fichier constants.xml
avec le contenu suivant:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="LANDSCAPE">0</integer>
<integer name="PORTRAIT">1</integer>
</resources>
Votre code est alors aussi simple que (par exemple, une disposition verticale/horizontale pour une vue de recyclage dans un fragment
val a = activity as AppCompatActivity
val orientation = a.getRotation()
when (orientation){
R.integer.PORTRAIT -> rv.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL,false)
R.integer.LANDSCAPE -> rv.layoutManager = LinearLayoutManager(activity, RecyclerView.HORIZONTAL,false)
}
Je pense que le moyen le plus sûr et le plus simple consiste à ajouter une balise pour certains éléments de votre activité en XML. Par exemple, définissez la balise du viewpager sur "portrait" dans la présentation de portrait et sur "paysage" dans dans paysage. Ensuite, dans votre recherche oncreate pour cette balise, comme ceci:
if(mViewpager.getTag().equals("portrait"))
// is in portrait
else
// is in landscape
Cela peut ne pas être pertinent, mais si vous devez le savoir par hasard, car vous souhaitez verrouiller le périphérique dans son orientation actuelle, vous pouvez basculer entre les deux lignes de code suivantes.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);