引言
之前我做了自定义Dialog弹出框,但我发现在实际的使用中其颜色会与背景白色显示相冲突,不会凸显出自定义Dialog弹出框的白色背景效果。而非自定义的Dialog它本身自带弹出时背景颜色变暗+消失时背景颜色恢复的效果,我就在想如何自定义实现这个效果呢?
于是,通过动画,实现了渐变色效果,当弹出Dialog时,除弹出提示框外的主布局背景逐渐暗化;当Dialog消失时,主布局背景逐渐恢复原色。主要通过控制主布局背景的透明度来实现。
实现效果
传送门
新增自定义方法:两个
/**
* 设置透明度
*/
private void setBackgroundAlpha(float bgAlpha) {
WindowManager.LayoutParams lp = ((Activity) mContext).getWindow().getAttributes();
lp.alpha = bgAlpha;
((Activity) mContext).getWindow().setAttributes(lp);
}
/**
* 显示弹窗,过程中伴随背景逐渐变暗。
* 不要改变MaskLayout的背景色,否则会是灰色背景的框框整体向上升起的效果。
*/
public void show(View parent) {
ValueAnimator animator = ValueAnimator.ofFloat(1, 0.5f).setDuration(500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
setBackgroundAlpha((Float) animation.getAnimatedValue());
}
});
animator.start();
}
具体如何调用
自定义SelfDialog类中(以下三步都是)
(1)首先声明
//上下文环境
Context mContext;
View contentView;
(2)在构造函数中的逻辑代码
public SelfDialog(@NonNull Context context) {
super(context, R.style.MyDialog); //构造方法中设置Dialog的样式
this.mContext = context;
contentView = LayoutInflater.from(mContext).inflate(R.layout.popup_select_layout, null);
/**
* 显示Dialog时背景变暗,消失时恢复亮度
*/
setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
ValueAnimator animator = ValueAnimator.ofFloat(0.5f, 1f).setDuration(500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
setBackgroundAlpha((Float) animation.getAnimatedValue());
}
});
animator.start();
}
});
}
(3)同样在SelfDialog类中重写的onCreate方法中调用show(View parent)方法进行显示。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mydialog_layout);
......
......
show(contentView);
}