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

被折叠的 条评论
为什么被折叠?



