BottomSheetDialog 阴影渐变
1.在使用BottomSheetDialog的时候,大家可能都有这样的感觉,这个阴影在窗口下拉过程中一直都存在而且还没变化,有点丑。那让我们给阴影加入一个透明度跟随的效果吧。
2.Dialog的阴影黑暗度是可以设置的,那只需要根据滚动的回调改变它,就能达到我们想要的效果
3.继承BottomSheetDialog
public class AlphaDialog extends BottomSheetDialog {
public AlphaDialog(@NonNull Context context) {
super(context);
init();
}
}
4.反射覆盖BottomSheetDialog
中BottomSheetBehavior
的滚动回调
private void init(){
//设置布局
setContentView(R.layout.content);
final Window window = getWindow();
//支持阴影
window.addFlags( WindowManager.LayoutParams.FLAG_DIM_BEHIND);
final WindowManager.LayoutParams params = window.getAttributes();
window.setAttributes(params);
Class parent = getClass().getSuperclass();
try {
//获取父类属性
Field behaviorField = parent.getDeclaredField("mBehavior");
behaviorField.setAccessible(true);
mBehavior = (BottomSheetBehavior<FrameLayout>) behaviorField.get(this);
if (mBehavior != null){
//设置新的回调
mBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
cancel();
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
//NaN do nothing
if (Double.isNaN(slideOffset)){
return;
}
//默认黑暗度 0.5
float scale = (float) (0.5f+0.5*slideOffset);
//只取1位小数 变化效果更明显
DecimalFormat df = new DecimalFormat("##0.0");
if (scale < 0f){
scale = 0;
}
scale = Float.parseFloat(df.format(scale));
params.dimAmount = scale;
window.setAttributes(params);
}
});
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}
}
5.有可能Dialog 对象多次 调用show() 方法 因此还需要在show()调用的时候还原 阴影和BottomSheetBehavior的状态。
6.好了,可以根据需求调节 scale 的值~