美文网首页自定义控件
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