Как сделать анимацию для всплывающего окна в Android - PullRequest
41 голосов
/ 12 февраля 2012

У меня есть всплывающее окно в моем приложении, оно появляется при нажатии какой-либо кнопки. Я хочу установить для этого окна анимацию постепенного изменения, я помещаю XML-файл в папку "res / anim" и задаю стиль анимации для всплывающего окнаа анимация не работает?вот мои коды:

myanim.xml ...

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0.0"
        android:toAlpha="1.0" 
        android:interpolator="@android:anim/accelerate_interpolator" 
        android:duration="4000"
        android:repeatCount="1"/>
</set>

==============================================

Создание всплывающего окна

private PopupWindow showOptions(Context mcon){
    try{ 
        LayoutInflater inflater = (LayoutInflater) mcon.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.options_layout,null);
        layout.setAnimation(AnimationUtils.loadAnimation(this, R.anim.myanim));
        PopupWindow optionspu = new PopupWindow(layout, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        optionspu.setFocusable(true);
        optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
        optionspu.update(0, 0, LayoutParams.WRAP_CONTENT, (int)(hei/5));
        optionspu.setAnimationStyle(R.anim.myanim);
        return optionspu;
    }
    catch (Exception e){e.printStackTrace();
    return null;}
}

======================================================= метод onClick ... (optionsPopup является глобальнымпеременная типа PopupWindow)

 @Override
public void onClick(View v) {
               switch (v.getId()) { 
        case R.id.options:
                optionsPopup=showOptions(this);
            break;  
}

Ответы [ 4 ]

102 голосов
/ 15 сентября 2012

Я думаю, проблема в том, что вы предоставили только один набор стилей анимации. Но на самом деле PopupWindow требует две анимации. Один будет использоваться им при показе окна, а другой - чтобы скрыть окно.

Вот как это сделать,

1) Создание двух разных наборов анимаций.

скажем, popup_show.xml и popup_hide.xml и добавьте его в папку anim , которую необходимо создать внутри res папка.

2) Теперь внутри папки values ​​ создайте XML-файл с именем styles.xml и добавьте к нему эти анимации следующим образом:

<style name="Animation">
    <item name="android:windowEnterAnimation">@anim/popup_show</item>
    <item name="android:windowExitAnimation">@anim/popup_hide</item>
</style>

3) Теперь установите этот стиль для вашей PopupWindow анимации,

 popup.setAnimationStyle(R.style.Animation);

Теперь он автоматически определяет окно входа и выхода и обеспечивает необходимую анимацию.

13 голосов
/ 11 сентября 2013

Я использую всплывающую анимацию с этим кодом:

// Creating the PopupWindow
       layoutInflater = (LayoutInflater)     getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

       inflatedLayoutView = layoutInflater.inflate(R.layout.packages_popup,null);
     inflatedLayoutView.setAnimation(AnimationUtils.loadAnimation(this, R.animator.popupanim)


    popup_l = new PopupWindow(inflatedLayoutView);

   popup_l.setWidth(FrameLayout.LayoutParams.WRAP_CONTENT);
   popup_l.setHeight(FrameLayout.LayoutParams.WRAP_CONTENT);     
   popup_l.setFocusable(true);
   // Clear the default translucent background
   popup_l.setBackgroundDrawable(new BitmapDrawable());       

   popup_l.showAtLocation(parent, Gravity.CENTER, 0 , 0);   

   popup_l.setOutsideTouchable(false);

, расположенный в /res/animator/popupanim.xml (popupanim.xml), код анимации:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<alpha android:fromAlpha="0.0"
        android:toAlpha="1.0" 
        android:interpolator="@android:anim/accelerate_interpolator" 
        android:duration="500"
        android:repeatCount="0"/>
</set>
5 голосов
/ 21 сентября 2015

Это может быть немного поздно, но причина, по которой анимация не показывается, заключается в том, что вы отображаете всплывающее окно перед настройкой анимации.анимация:

optionspu.setAnimationStyle(R.anim.myanim);
optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
4 голосов
/ 29 мая 2018

Пользовательский макет PopupWindow более удобен, и позиция отображения свободна, никаких ограничений нет. Используйте код ниже и наслаждайтесь анимацией. В этой анимации используйте нижний слайд и слайд, но вы можете изменить только анимацию слайда / входа и анимировать любое место в вашем приложении и еще одну вещь в соответствии с вашей анимацией, вы должны изменить гравитацию - >> BOTTOM, TOP и т. Д.

папка ресурса anim:

1.slide_in_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false"
    >

  <translate
      android:duration="@integer/dialogplus_animation_default_duration"
      android:fromXDelta="0%"
      android:fromYDelta="100%"
      android:toXDelta="0%"
      android:toYDelta="0%"
      />
</set>

2.slide_out_bottom.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false"
    >

  <translate
      android:duration="@integer/dialogplus_animation_default_duration"
      android:fromXDelta="0%"
      android:fromYDelta="0%"
      android:toXDelta="0%"
      android:toYDelta="100%"
      />
</set>

Стиль:

<style name="popup_window_animation">
        <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
        <item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
    </style>

Метод:

 private PopupWindow showOptions(Context mcon){
        try{
            LayoutInflater inflater = (LayoutInflater) mcon.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            View layout = inflater.inflate(R.layout.popup_option_documents_type,null);
            PopupWindow optionspu = new PopupWindow(layout, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            optionspu.setAnimationStyle(R.style.popup_window_animation);
            optionspu.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
            optionspu.setFocusable(true);
            optionspu.setOutsideTouchable(true);
            optionspu.update(0, 0, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            optionspu.showAtLocation(layout, Gravity.BOTTOM, 0, 0);

            return optionspu;
        }
        catch (Exception e){e.printStackTrace();
            return null;}
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...