package com.mylhyl.circledialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Color; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; import androidx.annotation.ColorInt; import androidx.annotation.FloatRange; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import com.mylhyl.circledialog.internal.BackgroundHelper; import com.mylhyl.circledialog.internal.Controller; import com.mylhyl.circledialog.res.drawable.CircleDrawable; import com.mylhyl.circledialog.res.values.CircleDimen; /** * Created by hupei on 2017/3/29. */ public abstract class AbsBaseCircleDialog extends DialogFragment { private static final String SAVED_GRAVITY = "circle:baseGravity"; private static final String SAVED_TOUCH_OUT = "circle:baseTouchOut"; //private static final String SAVED_CANCELED_BACK = "circle:baseCanceledBack"; private static final String SAVED_WIDTH = "circle:baseWidth"; private static final String SAVED_HEIGHT_MAX = "circle:baseMaxHeight"; private static final String SAVED_PADDING = "circle:basePadding"; private static final String SAVED_ANIM_STYLE = "circle:baseAnimStyle"; private static final String SAVED_DIM_ENABLED = "circle:baseDimEnabled"; private static final String SAVED_DIM_AMOUNT = "circle:baseDimAmount"; private static final String SAVED_BACKGROUND_COLOR = "circle:baseBackgroundColor"; private static final String SAVED_RADIUS = "circle:baseRadius"; private static final String SAVED_ALPHA = "circle:baseAlpha"; private static final String SAVED_X = "circle:baseX"; private static final String SAVED_Y = "circle:baseY"; private SystemBarConfig mSystemBarConfig; private int mGravity = Gravity.CENTER;//对话框的位置 private boolean mCanceledOnTouchOutside = true;//是否触摸外部关闭 //private boolean mCanceledBack = true;//是否返回键关闭 private float mWidth = CircleDimen.DIALOG_WIDTH;//对话框宽度,范围:0-1;1整屏宽 private float mMaxHeight;//对话框高度,范围:0-1;1整屏高 private int[] mPadding;//对话框与屏幕边缘距离 private int mAnimStyle;//显示动画 private boolean isDimEnabled = true; private float mDimAmount = CircleDimen.DIM_AMOUNT; // 背景灰暗值 private int mBackgroundColor = Color.TRANSPARENT;//对话框的背景色 private int mRadius = CircleDimen.DIALOG_RADIUS;//对话框的圆角半径 private float mAlpha = CircleDimen.DIALOG_ALPHA;//对话框透明度,范围:0-1;1不透明 private int mX, mY; private int mSystemUiVisibility; public AbsBaseCircleDialog() { } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSystemBarConfig = new SystemBarConfig(getActivity()); //设置 无标题 无边框 setStyle(DialogFragment.STYLE_NO_TITLE, 0); if (savedInstanceState != null) { mGravity = savedInstanceState.getInt(SAVED_GRAVITY); mCanceledOnTouchOutside = savedInstanceState.getBoolean(SAVED_TOUCH_OUT); //mCanceledBack = savedInstanceState.getBoolean(SAVED_CANCELED_BACK); mWidth = savedInstanceState.getFloat(SAVED_WIDTH); mMaxHeight = savedInstanceState.getFloat(SAVED_HEIGHT_MAX); mPadding = savedInstanceState.getIntArray(SAVED_PADDING); mAnimStyle = savedInstanceState.getInt(SAVED_ANIM_STYLE); isDimEnabled = savedInstanceState.getBoolean(SAVED_DIM_ENABLED); mDimAmount = savedInstanceState.getFloat(SAVED_DIM_AMOUNT); mBackgroundColor = savedInstanceState.getInt(SAVED_BACKGROUND_COLOR); mRadius = savedInstanceState.getInt(SAVED_RADIUS); mAlpha = savedInstanceState.getFloat(SAVED_ALPHA); mX = savedInstanceState.getInt(SAVED_X); mY = savedInstanceState.getInt(SAVED_Y); } } @Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); remove(); mSystemBarConfig = null; } @Override public void onStart() { if (getView() != null && mMaxHeight > 0) { getView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int height = getView().getHeight(); int screenHeight = mSystemBarConfig.getScreenHeight(); int maxHeight = (int) (screenHeight * mMaxHeight); if (height > maxHeight) { getView().getViewTreeObserver().removeOnGlobalLayoutListener(this); getView().setLayoutParams(new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, maxHeight)); } } }); } Dialog dialog = getDialog(); if (dialog != null) { dialog.setCanceledOnTouchOutside(mCanceledOnTouchOutside); //dialog.setCancelable(mCanceledBack); setDialogGravity(dialog);//设置对话框布局 if (mSystemUiVisibility != 0) { dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE , WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); } } super.onStart(); if (dialog != null && mSystemUiVisibility != 0) { dialog.getWindow().getDecorView().setSystemUiVisibility(mSystemUiVisibility); dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(SAVED_GRAVITY, mGravity); outState.putBoolean(SAVED_TOUCH_OUT, mCanceledOnTouchOutside); //outState.putBoolean(SAVED_CANCELED_BACK, mCanceledBack); outState.putFloat(SAVED_WIDTH, mWidth); outState.putFloat(SAVED_HEIGHT_MAX, mMaxHeight); if (mPadding != null) { outState.putIntArray(SAVED_PADDING, mPadding); } outState.putInt(SAVED_ANIM_STYLE, mAnimStyle); outState.putBoolean(SAVED_DIM_ENABLED, isDimEnabled); outState.putFloat(SAVED_DIM_AMOUNT, mDimAmount); outState.putInt(SAVED_BACKGROUND_COLOR, mBackgroundColor); outState.putInt(SAVED_RADIUS, mRadius); outState.putFloat(SAVED_ALPHA, mAlpha); outState.putInt(SAVED_X, mX); outState.putInt(SAVED_Y, mY); } public void remove() { FragmentManager fragmentManager = getFragmentManager(); if (fragmentManager == null) return; FragmentTransaction ft = fragmentManager.beginTransaction(); ft.remove(this); ft.addToBackStack(null); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = createView(getContext(), inflater, container); return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); CircleDrawable circleDrawable = new CircleDrawable(mBackgroundColor, Controller.dp2px(getContext(), mRadius)); BackgroundHelper.handleBackground(view, circleDrawable); view.setAlpha(mAlpha); } public abstract View createView(Context context, LayoutInflater inflater, ViewGroup container); public SystemBarConfig getSystemBarConfig() { return mSystemBarConfig; } /** * 设置对话框位置 * {@link Gravity#CENTER 默认} * * @param gravity 位置 */ protected void setGravity(int gravity) { mGravity = gravity; } /** * 设置对话框点击外部关闭 * * @param cancel true允许 */ protected void setCanceledOnTouchOutside(boolean cancel) { mCanceledOnTouchOutside = cancel; } // /** // * 设置对话框返回键关闭关闭 // * // * @param cancel true允许 // */ // protected void setCanceledBack(boolean cancel) { // mCanceledBack = cancel; // } /** * 设置对话框宽度 * * @param width 0.0 - 1.0 */ protected void setWidth(@FloatRange(from = 0.0, to = 1.0) float width) { mWidth = width; } /** * 设置对话框最大高度 * * @param maxHeight 0f - 1f 之间 */ protected void setMaxHeight(@FloatRange(from = 0.0, to = 1.0) float maxHeight) { mMaxHeight = maxHeight; } /** * 设置边距 * * @param left px * @param top px * @param right px * @param bottom px */ protected void setPadding(int left, int top, int right, int bottom) { mPadding = new int[]{left, top, right, bottom}; } /** * 弹出对话框的动画 * * @param animStyle StyleRes */ protected void setAnimations(int animStyle) { mAnimStyle = animStyle; } /** * 设置背景是否昏暗,默认true * * @param dimEnabled true昏暗 */ protected void setDimEnabled(boolean dimEnabled) { isDimEnabled = dimEnabled; } /** * 设置背景昏暗值 * * @param dimAmount * @see #setDimEnabled(boolean) true 才有效 */ protected void setDimAmount(@FloatRange(from = 0.0, to = 1.0) float dimAmount) { this.mDimAmount = dimAmount; } /** * 设置对话框背景色 * * @param color 颜色值 */ protected void setBackgroundColor(@ColorInt int color) { mBackgroundColor = color; } /** * 设置对话框圆角 * * @param radius 半径 */ protected void setRadius(int radius) { mRadius = radius; } /** * 设置对话框透明度 * * @param alpha 0.0 - 1.0 */ protected void setAlpha(@FloatRange(from = 0.0, to = 1.0) float alpha) { mAlpha = alpha; } protected void setX(int x) { mX = x; } protected void setY(int y) { mY = y; } /** * 底部位置且充满宽 */ protected void bottomFull() { this.mGravity = Gravity.BOTTOM; this.mRadius = 0; this.mWidth = 1f; this.mY = 0; } protected void setSystemUiVisibility(int systemUiVisibility) { this.mSystemUiVisibility = systemUiVisibility; } //显示键盘 protected void setSoftInputMode() { getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } /** * 对话框配置 * * @param dialog */ private void setDialogGravity(Dialog dialog) { Window window = dialog.getWindow(); window.setBackgroundDrawableResource(android.R.color.transparent); WindowManager.LayoutParams wlp = window.getAttributes(); int screenWidth = mSystemBarConfig.getScreenWidth(); if (mWidth > 0 && mWidth <= 1) { wlp.width = (int) (screenWidth * mWidth);//宽度按屏幕大小的百分比设置 } else { wlp.width = (int) mWidth; } wlp.gravity = mGravity; wlp.x = mX; wlp.y = mY; //边距 if (mPadding != null) { int[] padding = mPadding; wlp.width = WindowManager.LayoutParams.MATCH_PARENT; window.getDecorView().setPadding(padding[0], padding[1], padding[2], padding[3]); } wlp.dimAmount = mDimAmount; window.setAttributes(wlp); //动画 if (mAnimStyle != 0) { window.setWindowAnimations(mAnimStyle); } //背景灰暗 if (isDimEnabled) { window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); } else { window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); } } }