PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。
PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
MainActivity代码:
public class MainActivity extends Activity {
private Button bt;
private PopupWindow pop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = (Button) findViewById(R.id.bt);
initDui();
}
private void initDui() {
LayoutInflater inflater = LayoutInflater.from(this);
// 引入窗口配置文件
View view = inflater.inflate(R.layout.a, null);
//创建PopupWindow对象,指定宽度和高度(new PopupWindow(view, 400, 600)后2个参数是指定宽高;
pop = new PopupWindow(view, LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT, false);
// 设置背景颜色
pop.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#0f00f0")));
//弹出淡去动画设置
pop.setAnimationStyle(R.style.Animation);
// 设置点击窗口外边窗口消失
pop.setOutsideTouchable(true);
// 设置此参数获得焦点,否则无法点击
pop.setFocusable(true);
//更新popupwindow的状态
pop.update();
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (pop.isShowing()) {
// 隐藏窗口,如果设置了点击窗口外小时即不需要此方式隐藏
pop.dismiss();
} else {
// 显示窗口在布局底部
pop.showAtLocation(v, Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0,0);
}
}
});
}
}
对话框布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="200dp"
android:layout_height="200dp"
android:text="aaaaaa"
android:gravity="center"
/>
</LinearLayout>
设置PopupWindow弹出和淡出的动画效果
1、在res目录下建立一个文件夹anim,专门用于存储PopupWindow弹出和淡出的动画效果
(1)PopupWindow 弹出时的动画效果
res/anim/enter_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromYDelta="100%p"
android:toYDelta="0"
android:duration="500" />
<alpha
android:fromAlpha="0"
android:toAlpha="1.0"
android:duration="300"/>
</set>
(2)PopupWindow 淡出时的动画效果
res/anim/out_anim.xm
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromYDelta="0"
android:toYDelta="100%p"
android:duration="3000"/>
<alpha
android:fromAlpha="1.0"
android:toAlpha="0"
android:duration="2000"/>
</set>
在标签中,fromYDelta, toYDelta 表示在y轴方法的移动,因为我是要实现从底部弹出PopupWindow的,所以,是y轴,如果想要实现从屏幕侧边的话,可以选择x轴fromXDelta, toXDelta。
duration 表示弹出或者淡出的动画时间。在标签中表示PopupWindow透明度的变化,这样是为了比较好看。duration 同样表示时间。
(3)增加这样的Style
在res/valus/styles.xml 的标签内添加
<!-- popupwindow 动画 -->
<style name="Animation">
<item name="android:windowEnterAnimation">@anim/enter_anim</item>
<item name="android:windowExitAnimation">@anim/out_anim</item>
</style>
表示窗口弹出时的动画文件,@anim/enter_anim 中enter_anim一定要和我们前面定义弹出动画的文件名一致,淡出的动画文件类似。
最后在Actviity中设置
//弹出淡去动画设置
pop.setAnimationStyle(R.style.Animation);