前言
关于PopupWindow和Dialog的问题,我觉得PopupWindow灵活性超强。
1.位置任性,基本上是任意位置了
2.布局随性,需要什么布局,就搞什么布局,随意打造
3.美观度较高
所以我比较喜欢用PopupWindow。
如何实现—–超简单
一、无任何效果的单纯弹窗
一、要弹出的xml
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#ffffff"
android:orientation="vertical">
android:layout_height="1dp"
android:background="@color/colorAccent" />
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="相册" />
android:layout_height="1dp"
android:background="@color/gray" />
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="拍照" />
android:layout_height="1dp"
android:background="@color/gray" />
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="取消" />
我比较推荐这种需要什么画什么的布局,因为弹窗都不复杂,而且这样灵活性较高,特殊需求除外。
二、Activity的书写
//无任何效果的弹窗
private void showNoneEffect() {
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View vPopupWindow = inflater.inflate(R.layout.popupwindow, null, false);//引入弹窗布局
popupWindow = new PopupWindow(vPopupWindow, ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT, true);
//引入依附的布局
View parentView = LayoutInflater.from(PopupWindowActivity.this).inflate(R.layout.layout_popupwindow, null);
//相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
popupWindow.showAtLocation(parentView, Gravity.BOTTOM, 0, 0);
}
最简单的效果就实现了
二、 透明背景
一、还是布局
不重复书写了,还是上面的布局就可以
二、Antivity的书写
透明背景咱需要添加一个方法,这个方法贼好用
private void addBackground() {
// 设置背景颜色变暗
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 0.7f;//调节透明度
getWindow().setAttributes(lp);
//dismiss时恢复原样
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 1f;
getWindow().setAttributes(lp);
}
});
}
只需要引入这个方法就可以了
private void showShadow() {
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View vPopupWindow = inflater.inflate(R.layout.popup_noneffect, null, false);//引入弹窗布局
popupWindow = new PopupWindow(vPopupWindow, ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT, true);
//设置背景透明
addBackground();
//引入依附的布局
View parentView = LayoutInflater.from(PopupWindowActivity.this).inflate(R.layout.layout_popupwindow, null);
//相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
popupWindow.showAtLocation(parentView, Gravity.BOTTOM, 0, 0);
}
透明背景就这么简单
三、动画效果
一、还是布局,不说了
二、准备工作
这个就稍微有些麻烦,首先新建两个文件
1.res/anim/popup_in.xml,进来时的动画
android:fromYDelta="100%"
android:toXDelta="0"
/>
2.res/anim/popup_out.xml,出去时的动画
android:fromYDelta="0"
android:toYDelta="100%"
/>
3.style.xml新建一个样式
引入前两个我
三、给Popup设置样式
private void showAnimation() {
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View vPopupWindow = inflater.inflate(R.layout.popup_noneffect, null, false);//引入弹窗布局
popupWindow = new PopupWindow(vPopupWindow, ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT, true);
//设置背景透明
addBackground();
//设置进出动画
popupWindow.setAnimationStyle(R.style.PopupWindowAnimation);
//引入依附的布局
View parentView = LayoutInflater.from(PopupWindowActivity.this).inflate(R.layout.layout_popupwindow, null);
//相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
popupWindow.showAtLocation(parentView, Gravity.BOTTOM, 0, 0);
}
到这里就结束了,很简单吧,代码可以直接拿去用。
作者:L代码
来源:CSDN
原文:https://blog.csdn.net/qq_34882418/article/details/80999468
版权声明:本文为博主原创文章,转载请附上博文链接!