import android.app.Activity;
import android.graphics.drawable.ColorDrawable;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.PopupWindow;
import com.zy.jewelrybox.R;
/**
* 弹出框
*/
public class CommonPopupWindow extends PopupWindow {
private Activity context;
//弹出框布局
private View layout;
//弹出框参数
WindowManager.LayoutParams lp;
Window window;
public CommonPopupWindow(Activity context, View layout, int width, int height) {
super(layout, width, height);
this.layout = layout;
this.context = context;
window = context.getWindow();
initWindow();
}
//弹出框配置
private void initWindow() {
lp = window.getAttributes();
//显示时自动获取焦点(当获取焦点时输入框才能输入内容)
setFocusable(true);
//配置背景资源(才能够响应返回键)
setBackgroundDrawable(new ColorDrawable());
//触摸外面可以隐藏弹出框
setOutsideTouchable(true);
setAnimationStyle(R.style.popupAnimation);
}
@Override
public void dismiss() {
super.dismiss();
//设置弹框消失后背景还原
windowDismiss();
}
@Override
public void showAsDropDown(View anchor, int xoff, int yoff) {
//设置弹框出现后背景变暗
windowShow();
super.showAsDropDown(anchor, xoff, yoff);
}
public void showAtLocation(View parent, int gravity, int x, int y) {
//设置弹框出现后背景变暗
windowShow();
super.showAtLocation(parent, gravity, x, y);
}
/**
* 弹出的过程中,慢慢变暗。是有一个过程的,而不是一下子就暗下来了。这里利用延时和Handler来动态地改变背景的透明度。
*/
private void windowShow() {
new Thread(new Runnable() {
@Override
public void run() {
try {
while (lp.alpha > 0.5f) {
//4是根据弹出动画时间和减少的透明度计算
Thread.sleep(4);
//每次减少0.01,精度越高,变暗的效果越流畅
lp.alpha -= 0.01f;
mHandler.sendEmptyMessage(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 返回的时候把透明度调回来:
*/
private void windowDismiss() {
new Thread(new Runnable() {
@Override
public void run() {
//此处while的条件alpha不能<= 否则会出现黑屏
try {
while (lp.alpha < 1f) {
Thread.sleep(4);
lp.alpha += 0.01f;
mHandler.sendEmptyMessage(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
backgroundAlpha();
}
}
};
/**
* 设置添加屏幕的背景透明度
*
*/
public void backgroundAlpha() {
window.setAttributes(lp);
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}
}
PopupWindow 自定义用法
最新推荐文章于 2024-08-18 03:33:20 发布