popupwindow 全屏遮罩并解决SDK>21窗口最上方状态栏无法遮罩

PopupWindow全屏遮罩及SDK 21以上状态栏处理
当SDK版本低于21时,PopupWindow无法覆盖到状态栏。本文提供了解决此问题的修复代码,确保在所有版本上实现全屏遮罩效果。

sdk 版本小于21时,弹出的popupwindow时, 窗口最上方状态栏无法遮罩。
修复无法遮罩代码如下

import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.blankj.utilcode.utils.ScreenUtils;

/**
 * <b>类名称:</b> WaitScreen <br/>
 * <b>类描述:</b> 等待界面<br/>
 * <b>创建人:</b> Lincoln <br/>
 * <b>修改人:</b> Lincoln <br/>
 * <b>修改时间:</b> 16-9-28 下午5:35<br/>
 * <b>修改备注:</b> <br/>
 *
 * @version 1.0.0 <br/>
 */
public class WaitScreen {
    private PopupWindow popupWindow;
    private Context context;
    private View view;
    private final View progress;
    private final View wait;
    private final TextView messageView;

    public WaitScreen(Activity context) {
        this.context = context;
        view = LayoutInflater.from(context).inflate(R.layout.weight_wait_screen , null);
        popupWindow = new PopupWindow(view, ScreenUtils.getScreenWidth(context), ScreenUtils.getScreenHeight(context));
        //sdk > 21 解决 标题栏没有办法遮罩的问题
        popupWindow.setClippingEnabled(false);
        progress = view.findViewById(R.id.progress);
        wait = view.findViewById(R.id.wait);
        messageView = (TextView) view.findViewById(R.id.message);
    }

    /**
     * 弹出等待提示框
     */
    public PopupWindow show() {
	    //显示在界面0,0位置上
        popupWindow.showAtLocation(view, Gravity.NO_GRAVITY,0,0);
        Animation rotateAnim = AnimationUtils.loadAnimation(context, R.anim.rotate_progress);
        LinearInterpolator lin = new LinearInterpolator();
        rotateAnim.setInterpolator(lin);
        progress.startAnimation(rotateAnim);
        return popupWindow;
    }

    /**
     * 弹出等待提示框
     */
    public PopupWindow show(String message) {
        popupWindow.showAsDropDown(view);
        Animation rotateAnim = AnimationUtils.loadAnimation(context, R.anim.rotate_progress);
        LinearInterpolator lin = new LinearInterpolator();
        rotateAnim.setInterpolator(lin);
        progress.startAnimation(rotateAnim);
        messageView.setText(message);
        return popupWindow;
    }
    /**
     * 以动画的方式关闭等待弹屏
     */
    public void close(OnAnimationEnd onAnimationEnd) {
        if (popupWindow != null && popupWindow.isShowing()) {
            popupWindow.setFocusable(false);
            Animation alphaAnim = AnimationUtils.loadAnimation(context, R.anim.alpha_hide_progress);
            LinearInterpolator lin = new LinearInterpolator();
            alphaAnim.setInterpolator(lin);
            wait.startAnimation(alphaAnim);
            alphaAnim.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {

                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    new Handler().post(() -> popupWindow.dismiss());
                    onAnimationEnd.animationEnd();
                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });
        }
    }

    /**
     * 以动画的方式关闭等待弹屏
     */
    public void close() {
        if (popupWindow != null && popupWindow.isShowing()) {
            popupWindow.setFocusable(false);
            Animation alphaAnim = AnimationUtils.loadAnimation(context, R.anim.alpha_hide_progress);
            LinearInterpolator lin = new LinearInterpolator();
            alphaAnim.setInterpolator(lin);
            wait.startAnimation(alphaAnim);
            alphaAnim.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {

                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    new Handler().post(() -> popupWindow.dismiss());
                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });
        }
    }
    /**
     * 关闭弹屏
     */
    public void dismiss() {
        if (popupWindow != null && popupWindow.isShowing()) {
            popupWindow.dismiss();
        }
    }

    public interface OnAnimationEnd{
        void animationEnd();
    }
}

关键代码

popupWindow.setClippingEnabled(false);
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值