Guest User

Untitled

a guest
May 22nd, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 KB | None | 0 0
  1. import android.app.Activity;
  2. import android.app.Dialog;
  3. import android.graphics.Color;
  4. import android.graphics.drawable.ColorDrawable;
  5. import android.graphics.drawable.GradientDrawable;
  6. import android.os.Build;
  7. import android.support.annotation.NonNull;
  8. import android.support.design.widget.BottomSheetBehavior;
  9. import android.support.design.widget.CoordinatorLayout;
  10. import android.util.DisplayMetrics;
  11. import android.view.View;
  12. import android.view.ViewGroup;
  13. import android.view.Window;
  14.  
  15. /*
  16. FiskBottomSheetDialog dialog = new FiskBottomSheetDialog(activity, R.layout.some_layout, R.style.AppTheme);
  17. View view = dialog.getContentView();
  18. */
  19. public class FiskBottomSheetDialog {
  20.  
  21. private final Dialog dialog;
  22. private View contentView;
  23. private boolean cancelable = true;
  24.  
  25. private Dialog.OnDismissListener onDismissListener = null;
  26.  
  27. public FiskBottomSheetDialog(Activity context, int layout, int theme){
  28.  
  29. dialog = new Dialog(context, theme);
  30.  
  31. Window window = dialog.getWindow();
  32.  
  33. if(window != null){
  34. window.setDimAmount(0);
  35. window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
  36. window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
  37. }
  38.  
  39. contentView = context.getLayoutInflater().inflate (layout, null);
  40.  
  41. //Curved top corners:
  42. GradientDrawable curvedBackground = new GradientDrawable();
  43. curvedBackground.setColor(Color.WHITE);
  44.  
  45. float cornerRadius = 8 * ((float)context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
  46.  
  47. curvedBackground.setCornerRadii(new float[]{cornerRadius, cornerRadius, cornerRadius, cornerRadius, 0, 0, 0, 0});
  48. contentView.setBackground(curvedBackground);
  49.  
  50. //Full screen coordinator to hold the bottomsheet
  51. CoordinatorLayout coordinatorLayout = new CoordinatorLayout(context);
  52. coordinatorLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
  53. coordinatorLayout.setBackgroundColor(Color.parseColor("#00000000"));
  54.  
  55. BottomSheetBehavior bottomSheetBehavior = new BottomSheetBehavior();
  56. bottomSheetBehavior.setSkipCollapsed(true);
  57. bottomSheetBehavior.setHideable(true);
  58. bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
  59.  
  60. CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT);
  61. params.setBehavior(bottomSheetBehavior);
  62.  
  63. contentView.setLayoutParams(params);
  64.  
  65. coordinatorLayout.addView(contentView);
  66.  
  67. //Any click on the dimmed coordinator in the background should dismiss the dialog (unless setCanceleable(false); has been called):
  68. coordinatorLayout.setOnClickListener(_view -> {
  69. if(cancelable) BottomSheetBehavior.from(contentView).setState(BottomSheetBehavior.STATE_HIDDEN);
  70. });
  71.  
  72. bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
  73.  
  74. @Override
  75. public void onStateChanged(@NonNull View bottomSheet, int newState) {
  76. switch(newState){
  77. case BottomSheetBehavior.STATE_HIDDEN:
  78. dialog.dismiss();
  79. if (onDismissListener != null) onDismissListener.onDismiss(dialog);
  80. break;
  81. }
  82. }
  83.  
  84. //slideOffset is float in range 0 to 1 - remapped to 0 to 153 (0x99000000)
  85. @Override
  86. public void onSlide(@NonNull View bottomSheet, float slideOffset) {
  87. int alpha = (int)map(slideOffset, 0f, 1f, 0f, 153f);
  88. int overlayColor = Color.argb(alpha, Color.red(Color.BLACK), Color.green(Color.BLACK), Color.blue(Color.BLACK));
  89.  
  90. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && window != null) {
  91. window.setStatusBarColor(overlayColor);
  92. }
  93.  
  94. coordinatorLayout.setBackgroundColor(overlayColor);
  95. }
  96. });
  97.  
  98. dialog.setContentView(coordinatorLayout);
  99.  
  100. //Without this the bottom sheet doesn't animate, despite the default state being hidden
  101. BottomSheetBehavior.from(contentView).setState(BottomSheetBehavior.STATE_HIDDEN);
  102.  
  103. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) dialog.create();
  104. }
  105.  
  106. public void show(){
  107. dialog.show();
  108. contentView.post(() -> BottomSheetBehavior.from(contentView).setState(BottomSheetBehavior.STATE_EXPANDED));
  109. }
  110.  
  111. public void dismiss() {
  112. BottomSheetBehavior.from(contentView).setState(BottomSheetBehavior.STATE_HIDDEN);
  113. }
  114.  
  115. public void setCancelable(boolean cancelable){
  116. this.cancelable = cancelable;
  117. }
  118.  
  119. public View getContentView(){
  120. return contentView;
  121. }
  122.  
  123. public void setOnDismissListener(Dialog.OnDismissListener onDismissListener){
  124. this.onDismissListener = onDismissListener;
  125. }
  126.  
  127. private float map(float value, float start1, float stop1, float start2, float stop2) {
  128. return start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));
  129. }
  130. }
Add Comment
Please, Sign In to add comment