Я создаю приложение, которое создает крошечные анимации спрайтов, которые ходят по экрану.Как сделать полноэкранный оверлей оставшимся на экране после изменения ориентации?
У меня есть основная деятельность, с кнопкой «начать сервис». Это запустит службу, которая (в onCreate()
) создает полноэкранное представление и прикрепляет его к диспетчеру корневого окна.
Эта часть работает отлично. Он заполняет экран, и вы можете оставить приложение, и анимация будет по-прежнему видна во всем.
Проблема возникает при повороте устройства.
Спрайты переместились в середине экрана, но это не связано вопрос; важная вещь здесь - темный ограничивающий прямоугольник - этот ящик показывает вам холст, на который я могу нарисовать, и ему нужно заполнить весь экран.
Вид по-прежнему портретный, хотя все остальные макеты выглядят для правильного обновления.
Часть проблемы связана с тем, как я определил размеры вида. Я использовал флажки, чтобы указать «полный экран», но это не установить вид width
и height
в соответствии с размерами экрана. Таким образом, я должен был установить их вручную при запуске.
Я не знаю способ обновить ширину и высоту представления после создания представления, но я чувствую, что мне нужно, поскольку размеры представления определяют размеры холста.
Моя служба создает вид, как так:
public class WalkerService extends Service {
private WalkerView view;
@Override
public void onCreate() {
super.onCreate();
final WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
final DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);
view = new WalkerView(this); // extends SurfaceView
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // TYPE_SYSTEM_ALERT is denied in apiLevel >=19
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT
);
view.setFitsSystemWindows(false); // allow us to draw over status bar, navigation bar
// here I _manually_ set the dimensions, because otherwise it defaults to a square (something like 1024x1024)
params.width = metrics.widthPixels;
params.height = metrics.heightPixels;
wm.addView(view, params);
}
}
Я пытался слушать изменения ориентации и поворота вид, когда это произойдет:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
view.setRotation(
newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE
? 90.0f
: 0.0f
);
}
Но setRotation()
, похоже, не влияет width
и height
, и они не меняли угол, на котором был сделан холст.
Я в основном неправильно понимаю, как создать полноэкранный накладной? Как я могу поддерживать способность рисовать по всему экрану, независимо от ориентации (и даже когда мое приложение не является активным приложением)?
Возможно, это связано с тем, что я привязываю свое представление к оконному менеджеру Window Service - возможно, это означает, что мой взгляд имеет нечетного родителя (я мог представить, что, возможно, на корневом представлении не повлияет ориентация, или нет определенных границ для того, чтобы дети могли растягиваться, чтобы заполнить).
Полный исходный код public on GitHub в случае, если я опущен какой-либо полезной информацией здесь.
WalkerView.java
может быть особенно актуальным, поэтому here it is.
Я думаю, что это дублирующая проблема для этого http://stackoverflow.com/a/10107525/5870896 –
Как насчет наличия 2 просмотров.Один для портрета и один для пейзажа с правильной шириной и высотой для каждого. Когда происходит изменение ориентации, просто удалите ненужное представление и добавьте действительный вид в windowmanager. –
@SecretCoder Я считаю, что мой код уже похож на ответ на этот вопрос, так как это одна из ссылок, которые я использовал для создания моего кода. Единственное различие заключается в том, что связанный ответ захватывает ссылку на представление с помощью инфлятора, тогда как мой код создает экземпляр представления inline в службе. Учитывая, что у меня есть сопоставимый код с этим ответом, и _still_ испытывают проблему: я бы сказал, что связанная проблема не отвечает на мой вопрос и поэтому не является той же проблемой. – Birchlabs