PopupWindow 自定义用法

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);
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值