最近刚好遇到一个这样的需求,于是就写了这样的代码。
// show popup window
findViewById(R.id.btn_pop_show)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
LogUtils.e("click...");
// todo: popupWindow
final LinearLayout va = dpd.getDatePickerLayout();
PopupWindow window = new PopupWindow(getActivity());
window.setWidth(FrameLayout.LayoutParams.MATCH_PARENT);
window.setHeight(FrameLayout.LayoutParams.WRAP_CONTENT);
window.setContentView(va);
// 设置PopupWindow的背景
window.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
// 设置PopupWindow是否能响应外部点击事件
window.setOutsideTouchable(true);
// 添加动画
window.setAnimationStyle(R.style.pop_window_anim_style);
// window.showAsDropDown(v);
// 设置popupWindow的显示位置,此处是在手机屏幕底部且水平居中的位置
window.showAtLocation(v, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
}
});
显示的效果:
然后是动画的布局代码:
<!-- pop_in.xml -->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="100%"
android:toYDelta="0"
android:duration="800" />
</set>
以及
<!-- pop_out.xml -->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="100%"
android:duration="800" />
</set>
还有 styles.xml
里面
<style name="pop_window_anim_style">
<item name="android:windowEnterAnimation">@anim/pop_in</item>
<item name="android:windowExitAnimation">@anim/pop_out</item>
</style>
感觉下面这种方式设置 popupWindow
挺好的,特别适合这种需求。:
PopupWindow window = new PopupWindow(getActivity());
window.setWidth(FrameLayout.LayoutParams.MATCH_PARENT);
window.setHeight(FrameLayout.LayoutParams.WRAP_CONTENT);
window.setContentView(va);
popupWindow
还有通过指定宽高的方式来构造的,感觉不方便。因为要显示的view
可能来自布局文件。而布局文件里面一般不会写成xxdp
的宽高。这样的话,就需要计算出view
的宽高,才能构造出来,麻烦….
参考:
- Android 动画 - TranslateAnimation位移动画 【里面分析了位移动画的属性值,写的很好】
- Android从屏幕底部弹出popupWindow 里面设置动画的部分似乎不对,找不到对应的
api
,其他地方是对的。