Intereting Posts
Nexus 10 camera.release висит в течение 30 секунд WebView не нарисован, WARN / webcore (5336): не удается получить viewWidth после первого макета Возможно ли получить доступ к сигналу динамика на Android? Как получить таймер с высоким разрешением в собственном коде Android? Как я могу решить проблему Android Firebase «По умолчанию FirebaseApp не инициализирован в этом процессе»? Как настроить кинжал + град Android получает разницу в миллисекундах между двумя датами Как создавать карты, которые обнаруживают автоматическое местоположение в React-Native Как уменьшить размер sdk для Android на жестком диске Сбой API Карт Google (с использованием эмулятора Android) Как предотвратить захват экрана в Android Исключение NullPointerException при использовании LocalBroadcastManager Идентификатор пакета в android Genymotion – какой IP-адрес установлен в файле etc / hosts для локального веб-сервера хоста доступа через домен? Retrofit 2 как получить ответ от вложенных json-объектов (android)

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); 

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

Во-первых, пожалуйста, для вашего собственного здравомыслия, не скомпрометируйте кучу таких констант. Имя службы оконного менеджера – 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;