Windowmanager с анимацией - PullRequest
8 голосов
/ 27 июля 2011

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

У меня есть действие, и я хотел показать своего рода меню в верхней части экрана, и я использовал диспетчер окон, чтобы справиться с этим.это было о проблемах пользовательского интерфейса, с которыми я столкнулся, почему я выбираю 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);

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

Ответы [ 2 ]

18 голосов
/ 08 января 2013

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

1 голос
/ 26 июня 2014

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

...