美文网首页自定义控件
BottomSheetDialog 阴影渐变

BottomSheetDialog 阴影渐变

作者: LeoooL | 来源:发表于2017-06-27 22:44 被阅读0次

BottomSheetDialog 阴影渐变

1.在使用BottomSheetDialog的时候,大家可能都有这样的感觉,这个阴影在窗口下拉过程中一直都存在而且还没变化,有点丑。那让我们给阴影加入一个透明度跟随的效果吧。

2.Dialog的阴影黑暗度是可以设置的,那只需要根据滚动的回调改变它,就能达到我们想要的效果

3.继承BottomSheetDialog

public class AlphaDialog extends BottomSheetDialog {
    
    public AlphaDialog(@NonNull Context context) {
             super(context);
                init();
    }
}

4.反射覆盖BottomSheetDialogBottomSheetBehavior的滚动回调

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 的值~

相关文章

网友评论

    本文标题:BottomSheetDialog 阴影渐变

    本文链接:https://www.haomeiwen.com/subject/akrycxtx.html