Как сделать анимацию для всплывающего окна в android
У меня есть всплывающее окно в моем приложении, оно появляется при нажатии какой-либо кнопки
Я хочу установить в этом окне fade в анимации,
Я поместил 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 method... (optionsPopup - глобальная переменная типа PopupWindow)
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.options:
optionsPopup=showOptions(this);
break;
}
Ответы
Ответ 1
Я думаю, проблема в том, что вы предоставили только один набор стилей анимации. Но на самом деле 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);
Теперь он автоматически определяет вход и выход из окна и обеспечивает необходимую анимацию.
Ответ 2
Я использую всплывающие анимации с этим кодом:
// 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>
Ответ 3
Это может быть немного поздно, но причина, по которой анимация не отображалась, заключается в том, что вы показываете всплывающее окно перед настройкой анимации.
optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
optionspu.setAnimationStyle(R.anim.myanim);
Переверните две линии, и вы увидите анимацию:
optionspu.setAnimationStyle(R.anim.myanim);
optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
Ответ 4
Пользовательский макет 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;}
}