Подтвердить что ты не робот

Как определить ориентацию устройства Android?

Возможно ли определить текущую ориентацию устройства Android, не программируя слушателя и обрабатывая матрицу положения? В моем приложении я хочу только знать текущую ориентацию - вертикальную или горизонтальную - на данный момент. Однако я не хочу слушать события аксиометрии или других событий.

4b9b3361

Ответ 1

Используйте метод getRotation:

Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();

Из документации:

Возвращает поворот экрана из его "естественной" ориентации. Возвращаемое значение может быть Surface.ROTATION_0 (без вращения), Surface.ROTATION_90, Surface.ROTATION_180 или Surface.ROTATION_270. Например, если устройство имеет естественный высокий экран, и пользователь повернул его на свою сторону, чтобы перейти в ландшафтную ориентацию, значение, возвращаемое здесь, может быть либо Surface.ROTATION_90, либо Surface.ROTATION_270 в зависимости от направления, в котором оно было повернуто. Угол - это поворот рисунка на экране, который является противоположным направлением физического вращения устройства. Например, если устройство повернуто на 90 градусов против часовой стрелки, для компенсации рендеринга будет повернуто на 90 градусов по часовой стрелке, и поэтому возвращаемое значение здесь будет Surface.ROTATION_90.

Имейте в виду, что getRotation был представлен с Android 2.2. Используйте getOrientation, если ваша цель - более старые устройства.

Ответ 2

Вы также можете использовать:

getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE

Ответ 4

Вам просто нужно знать высоту и ширину вашего холста... вашу поверхность... ваш монитор... и т.д.

возможно, вы можете получить его с помощью:

if (canvas.getHeight()>canvas.getWidth() ) {
//portrait
}
else
{
//landscape
}

Ответ 5

Я думаю, что самый безопасный и простой способ - добавить тег для некоторого элемента вашей деятельности в XML. Например, установите тег viewpager на "портрет" в макете портрета и установите для него "пейзаж" в пейзаже. Затем в вашем oncreate проверьте этот тег следующим образом:

if(mViewpager.getTag().equals("portrait"))
  // is in portrait
else
  // is in landscape

Ответ 6

Это может быть не актуально, но если вы случайно это знаете, потому что хотите заблокировать устройство в его текущей ориентации, вы можете переключаться между двумя строками кода.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);

Ответ 7

Вы можете сделать функцию расширения из кода выше:

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
    }
}

В каталоге ресурсов создайте файл constants.xml со следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="LANDSCAPE">0</integer>
    <integer name="PORTRAIT">1</integer>
</resources>

В таком случае вы кодируете так же просто, как (например, вертикальное/горизонтальное расположение для Recyclerview во фрагменте:

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)
        }