OrientationEventListener (Tablet vs Mobile) разница в 90 градусов


Я использую OrientationEventListener для определения ориентации, но у меня есть проблема в том, что планшеты являются альбомными, а телефоны-портретными по умолчанию. Это означает, что OrientationEventListener возвращает значение 90 для портрета на планшетах, но 0 для портрета на мобильных телефонах.

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

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

            if(isTablet)
            {
                orientation += -90;
                if(orientation < 0) //Check if we have gone too far back, keep the result between 0-360
                {
                    orientation += 360;
                }   
            }
4 4

4 ответа:

Поскольку вы упомянули, что не можете переключаться между ориентациями, вам придется использовать свойства устройства, чтобы выяснить, является ли оно планшетом.

Взгляните на эту ссылку.

Вы можете использовать android.os.Build.DEVICE, android.os.Build.MODEL и android.os.Build.PRODUCT, чтобы получить идентичность устройства, и из этого знания, вы можете использовать эту ссылку, чтобы найти их значения и определить, что такое тип устройства.

Но используя этот метод, вы должны были бы обновлять программное обеспечение каждый раз, когда новый таблетка выпущена. (Я использовал Этот Вопрос в качестве ссылки на эту часть ответа).

Альтернативный вариант-это то, что я нашел здесь , цитируя ответ:

public boolean isTablet(Context context) {
    boolean xlarge = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);
    boolean large = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
    return (xlarge || large);
}

Большие и большие размеры экрана определяются производителем на основе на расстоянии от глаза они должны использоваться (таким образом, идея таблетка).

Надеюсь, это поможет!

Есть и другой подход. Вы можете использовать комбинацию ориентации текущей конфигурации и поворота дисплея, чтобы определить естественную ориентацию устройства, как описано здесь: Как проверить естественную ориентацию устройства (по умолчанию) на Android (т. е. получить ландшафт, например, Motorola Charm или Flipout). С помощью метода getDeviceDefaultOrientation (), описанного здесь, вы можете установить переменную isTablet следующим образом:

isTablet = (getDeviceDefaultOrientation() == Configuration.ORIENTATION_LANDSCAPE)

Если ваше приложение иногда заставляет в портретном или альбомном режиме вы можете вызвать getDeviceDefaultOrientation() в начале работы приложения (до принудительной ориентации конфигурации) и сохранить значение для последующего использования. В противном случае вы можете оказаться в состоянии, когда физическое вращение устройства не синхронизировано с конфигурационной ориентацией, как часто бывает, когда видео принудительно переводится в альбомный режим для полноэкранного просмотра, в то время как само устройство все еще имеет книжный поворот. Это можно сделать, позвонив по телефону Деятельность.setRequestedOrientation () во время выполнения, после сохранения результата getDeviceDefaultOrientation ().

Когда ориентация устройства меняется, ваша активность разрушается и воссоздается, что означает, что вам не нужно фактически "слушать" конкретное событие. Чтобы узнать, находитесь ли вы в книжной или альбомной ориентации, независимо от того, на каком устройстве выполняется ваш код:

switch (yourContext.getResources().getConfiguration().orientation) {
    case Configuration.ORIENTATION_LANDSCAPE:
        //xxx
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        //xxx
        break;
}

"onCreate" может быть хорошим местом для этого=)

На самом деле, я использовал ужасный хак, чтобы решить ту же проблему (и мне искренне стыдно :). Когда вы получите ориентацию сенсора, сравните ее с соотношением размеров экрана (широкий и высокий).

Ориентация с сенсора = = ориентация с экрана означает телефон, в противном случае планшет (или телевизор, ... или что там будет дальше). Вот код, который я использую, чтобы получить соотношение экрана/ориентацию (к сожалению, распознаются только 2 режима).

int getScreenOrientation(Activity ctx)  {
  Point pt = new Point(0,0);
  try {
    Display dsp =  ctx.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
      dsp.getSize(pt);
    } else {
      pt.x = dsp.getWidth();   
      pt.y = dsp.getHeight();
    }
  return  (pt.x <= pt.y) ?  
    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT :
    ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
  }
  catch (Exception e) {}
  return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
}

Это решает только проблему ориентации, но не решает ее. определите, является ли это таблетка. На самом деле, большинство моих 7-дюймовых вкладок не имеют проблемы несоответствия ориентации. Я нашел ее только на моем Nexus 10 и Android ТВ донгл.

"Не кодируй, как я, и все будет хорошо."

Шон