Android: динамически менять расположение меню настроек - PullRequest
1 голос
/ 18 февраля 2011

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

  1. Разрешить изменение ориентации, поэтомуменю перемещается по мере необходимости, затем используйте SensorManager, чтобы прослушать ориентацию, и вручную поверните вид холста обратно в «правильную» ориентацию (портрет).Это было бы некрасиво, так как может возникнуть задержка при вращении холста, и это вводит некоторые потенциально сложные вычисления и т. Д. Из-за перестановки X / Y.
  2. Ограничьте изменения ориентации, затем используйте SensorManagerчтобы прослушать ориентацию, и вручную поверните меню параметров вниз.Не знаю, возможно ли это.
  3. Заблокируйте ориентацию и создайте пользовательский вид, который перехватывает кнопку меню и отображает «ложное» меню опций, которым я должен управлять и т. Д. На самом деле действительно не хочу иметьзаменить встроенную функциональность ОС, может ли это стать кошмаром для будущих версий ОС и т. д.

У кого-нибудь есть идеи, как с этим справиться?Я бы с удовольствием, если бы № 2 был возможен, но не могу найти ничего, связанного с этим.

Спасибо,

Пол

РЕДАКТИРОВАТЬ:

Естьподтвердила, что № 2 невозможен, поэтому я думаю, что у меня есть варианты № 1, № 3, если у кого-то еще нет идей?

1 Ответ

0 голосов
/ 01 марта 2011

Мое решение заключается в следующем:

  • Разрешить нормальные изменения ориентации в манифесте Android для действия.
  • В пользовательском конструкторе представления «холст» запустите поле отслеживания, mDisplay, который получает информацию о дисплее с помощью:

Код:

mDisplay = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
  • В onDraw () проверьте, не является ли поворот экрана чем-то отличным от 0и поверните холст обратно до значения вращения 0:

Код:

if (mDisplay.getRotation() > 0) {
    canvas.save(Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
    canvas.rotate(-mDisplay.getRotation(), px, py);
    ...
    do stuff
    ...
    canvas.restore();
}

Не уверен, что это лучшее решение, но, похоже, оно работает.

...