Во-первых, пожалуйста, для вашего же здравого смысла не кодируйте кучу таких констант. Название службы оконного менеджера Context.WINDOW_SERVICE
. Тип окна WindowManager.LayoutParams.TYPE_PHONE
. Флаги, которые вы установили, это ... ммм ... WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
(серьезно, также записано в десятичном виде ??). Формат PixelFormat.RGBA_8888
(и я настоятельно рекомендую использовать PixelFormat.TRANSLUCENT
).
Теперь, во-первых, что в мире делают, используя TYPE_PHONE
? Вы не хотите этого делать. Если вы хотите, чтобы окно располагалось поверх вашего главного окна, вы должны использовать TYPE_APPLICATION
. На самом деле, я бы призываю вас просто использовать Dialog
для этого и установить в прикрепленном окне то, что вы хотите. Он позаботится обо всех деталях работы с оконным менеджером и никоим образом не ограничит вас в том, как вы можете его анимировать.
Я думаю, что главная проблема, с которой вы столкнулись, заключается в том, что вы пытаетесь анимировать корневой вид окна. Корневое представление несколько особенное - оно определяет самую верхнюю часть окна, точно соответствует окну и всегда должно соответствовать размеру окна. Это то, что управляет макетом его дочерних окон. Если вы хотите сделать анимацию вида, вы должны оставить корневой вид в покое (это якорь окна) и анимировать элементы внутри него.
Тем не менее, поскольку вы используете анимацию в старом стиле, есть лучший способ анимировать полные окна, способ, которым система анимирует диалоги и действия, и тому подобное: установите анимацию в параметрах макета окна. Затем менеджер окон применит эту анимацию ко всей поверхности окна, как вы укажете. Это более эффективно, чем делать это внутри окна, потому что для каждого кадра анимации требуется только перекомпоновка экрана с новым преобразованием анимации, а не перерисовывание содержимого окна и его повторная компоновка.
Вы делаете это, устанавливая WindowManager.LayoutParams.windowAnimations
. Это целочисленное поле, которое принимает идентификатор ресурса ресурса style , определяющего различные анимации, связанные с окном. Например, стиль, используемый для стандартных диалогов:
<style name="Animation.Dialog">
<item name="windowEnterAnimation">@anim/dialog_enter</item>
<item name="windowExitAnimation">@anim/dialog_exit</item>
</style>
Вы устанавливаете windowEnterAnimation
для ресурса анимации, который будет запускаться при отображении окна, и windowExitAnimation
для ресурса, который запускается, когда оно скрыто. Если не установлено, анимация не запускается.
Так что для вашего кода вы можете просто создать диалог, установить его содержимое в соответствии с вашим пользовательским содержимым, установить его гравитацию, ширину и высоту в соответствии с имеющимися у вас значениями, а в поле windowAnimations
установить свой стиль, определяющий анимации. Вы также можете настроить флаги, если хотите, чтобы поведение отличалось от диалога по умолчанию (не сенсорный модальный или такой). API на Dialog.getWindow()
имеет все необходимое для установки параметров макета.