Windowmanager с анимацией

Прежде всего, спасибо всем, кто пытается ответить на эту тему.

У меня есть активность, и я хотел показать своеобразное меню в верхней части экрана, и я использовал windowmanager для этого. Речь шла о проблемах пользовательского интерфейса, с которыми я столкнулся, почему я выбираю windowmanager для создания такого меню. Но пока я хочу, чтобы это меню было анимировано, но кажется, что анимация не действует. Вот мой код.

Если кто-нибудь знает, как оживить оконного менеджера, я буду признателен.

Animation animShowTopLine; animShowTopLine = AnimationUtils.loadAnimation(this, R.anim.translate); animShowTopLine.reset(); LinearLayout top_line; WindowManager wm; WindowManager.LayoutParams wmParams; LayoutInflater inflate = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); top_line = (LinearLayout) inflate.inflate(R.layout.line, null); wm =(WindowManager) getApplicationContext().getSystemService("window"); wmParams =new WindowManager.LayoutParams(); wmParams.type=2002; wmParams.format = 1; wmParams.flags=40; wmParams.width=WindowManager.LayoutParams.FILL_PARENT; wmParams.height=WindowManager.LayoutParams.WRAP_CONTENT; wmParams.gravity = Gravity.TOP; wm.addView(top_line, wmParams); top_line.startAnimation(animShowTopLine); 

Заранее спасибо. С уважением.

Solutions Collecting From Web of "Windowmanager с анимацией"

Во-первых, пожалуйста, для вашего собственного здравомыслия, не скомпрометируйте кучу таких констант. Имя службы оконного менеджера – Context.WINDOW_SERVICE . Тип окна – WindowManager.LayoutParams.TYPE_PHONE . Флаги, которые вы установили, являются … ummm … 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 name="Animation.Dialog"> <item name="windowEnterAnimation">@anim/dialog_enter</item> <item name="windowExitAnimation">@anim/dialog_exit</item> </style> 

Вы устанавливаете windowEnterAnimation для ресурса анимации, который будет запускаться при показе окна, и windowExitAnimation для запуска, когда он скрыт. Если он не установлен, анимация не запускается.

Итак, для вашего кода здесь вы можете просто создать диалоговое окно, установить его содержимое в свой собственный контент, установить его силу тяжести, ширину и высоту для значений, которые у вас есть, и установить поле windowAnimations в свой стиль, определяющий анимацию. Вы также можете настроить флаги, если хотите, чтобы какое-то поведение отличалось от диалога по умолчанию (не касаются модального или такого). API на Dialog.getWindow() имеет все необходимое для установки параметров макета.

mParams.windowAnimations = android.R.style.Animation_Toast;