package cn.pedant.SweetAlert; import android.app.Dialog; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.Transformation; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.pnikosis.materialishprogress.ProgressWheel; import java.util.List; /** * 由于作者的库没有及时更新,这里做出本地修改。 * 更新使用最新的'com.pnikosis:materialish-progress:1.7' * * {@see https://github.com/pedant/sweet-alert-dialog/issues/88} */ public class SweetAlertDialog extends Dialog implements View.OnClickListener { private View mDialogView; private AnimationSet mModalInAnim; private AnimationSet mModalOutAnim; private Animation mOverlayOutAnim; private Animation mErrorInAnim; private AnimationSet mErrorXInAnim; private AnimationSet mSuccessLayoutAnimSet; private Animation mSuccessBowAnim; private TextView mTitleTextView; private TextView mContentTextView; private String mTitleText; private String mContentText; private boolean mShowCancel; private boolean mShowContent; private String mCancelText; private String mConfirmText; private int mAlertType; private FrameLayout mErrorFrame; private FrameLayout mSuccessFrame; private FrameLayout mProgressFrame; private SuccessTickView mSuccessTick; private ImageView mErrorX; private View mSuccessLeftMask; private View mSuccessRightMask; private Drawable mCustomImgDrawable; private ImageView mCustomImage; private Button mConfirmButton; private Button mCancelButton; private ProgressHelper mProgressHelper; private FrameLayout mWarningFrame; private OnSweetClickListener mCancelClickListener; private OnSweetClickListener mConfirmClickListener; private boolean mCloseFromCancel; public static final int NORMAL_TYPE = 0; public static final int ERROR_TYPE = 1; public static final int SUCCESS_TYPE = 2; public static final int WARNING_TYPE = 3; public static final int CUSTOM_IMAGE_TYPE = 4; public static final int PROGRESS_TYPE = 5; public static interface OnSweetClickListener { public void onClick (SweetAlertDialog sweetAlertDialog); } public SweetAlertDialog(Context context) { this(context, NORMAL_TYPE); } public SweetAlertDialog(Context context, int alertType) { super(context, R.style.alert_dialog); setCancelable(true); setCanceledOnTouchOutside(false); mProgressHelper = new ProgressHelper(context); mAlertType = alertType; mErrorInAnim = OptAnimationLoader.loadAnimation(getContext(), R.anim.error_frame_in); mErrorXInAnim = (AnimationSet)OptAnimationLoader.loadAnimation(getContext(), R.anim.error_x_in); // 2.3.x system don't support alpha-animation on layer-list drawable // remove it from animation set if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { List<Animation> childAnims = mErrorXInAnim.getAnimations(); int idx = 0; for (;idx < childAnims.size();idx++) { if (childAnims.get(idx) instanceof AlphaAnimation) { break; } } if (idx < childAnims.size()) { childAnims.remove(idx); } } mSuccessBowAnim = OptAnimationLoader.loadAnimation(getContext(), R.anim.success_bow_roate); mSuccessLayoutAnimSet = (AnimationSet)OptAnimationLoader.loadAnimation(getContext(), R.anim.success_mask_layout); mModalInAnim = (AnimationSet) OptAnimationLoader.loadAnimation(getContext(), R.anim.modal_in); mModalOutAnim = (AnimationSet) OptAnimationLoader.loadAnimation(getContext(), R.anim.modal_out); mModalOutAnim.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mDialogView.setVisibility(View.GONE); mDialogView.post(new Runnable() { @Override public void run() { if (mCloseFromCancel) { SweetAlertDialog.super.cancel(); } else { SweetAlertDialog.super.dismiss(); } } }); } @Override public void onAnimationRepeat(Animation animation) { } }); // dialog overlay fade out mOverlayOutAnim = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { WindowManager.LayoutParams wlp = getWindow().getAttributes(); wlp.alpha = 1 - interpolatedTime; getWindow().setAttributes(wlp); } }; mOverlayOutAnim.setDuration(120); } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alert_dialog); mDialogView = getWindow().getDecorView().findViewById(android.R.id.content); mTitleTextView = (TextView)findViewById(R.id.title_text); mContentTextView = (TextView)findViewById(R.id.content_text); mErrorFrame = (FrameLayout)findViewById(R.id.error_frame); mErrorX = (ImageView)mErrorFrame.findViewById(R.id.error_x); mSuccessFrame = (FrameLayout)findViewById(R.id.success_frame); mProgressFrame = (FrameLayout)findViewById(R.id.progress_dialog); mSuccessTick = (SuccessTickView)mSuccessFrame.findViewById(R.id.success_tick); mSuccessLeftMask = mSuccessFrame.findViewById(R.id.mask_left); mSuccessRightMask = mSuccessFrame.findViewById(R.id.mask_right); mCustomImage = (ImageView)findViewById(R.id.custom_image); mWarningFrame = (FrameLayout)findViewById(R.id.warning_frame); mConfirmButton = (Button)findViewById(R.id.confirm_button); mCancelButton = (Button)findViewById(R.id.cancel_button); mProgressHelper.setProgressWheel((ProgressWheel)findViewById(R.id.progressWheel)); mConfirmButton.setOnClickListener(this); mCancelButton.setOnClickListener(this); setTitleText(mTitleText); setContentText(mContentText); setCancelText(mCancelText); setConfirmText(mConfirmText); changeAlertType(mAlertType, true); } private void restore () { mCustomImage.setVisibility(View.GONE); mErrorFrame.setVisibility(View.GONE); mSuccessFrame.setVisibility(View.GONE); mWarningFrame.setVisibility(View.GONE); mProgressFrame.setVisibility(View.GONE); mConfirmButton.setVisibility(View.VISIBLE); mConfirmButton.setBackgroundResource(R.drawable.blue_button_background); mErrorFrame.clearAnimation(); mErrorX.clearAnimation(); mSuccessTick.clearAnimation(); mSuccessLeftMask.clearAnimation(); mSuccessRightMask.clearAnimation(); } private void playAnimation () { if (mAlertType == ERROR_TYPE) { mErrorFrame.startAnimation(mErrorInAnim); mErrorX.startAnimation(mErrorXInAnim); } else if (mAlertType == SUCCESS_TYPE) { mSuccessTick.startTickAnim(); mSuccessRightMask.startAnimation(mSuccessBowAnim); } } private void changeAlertType(int alertType, boolean fromCreate) { mAlertType = alertType; // call after created views if (mDialogView != null) { if (!fromCreate) { // restore all of views state before switching alert type restore(); } switch (mAlertType) { case ERROR_TYPE: mErrorFrame.setVisibility(View.VISIBLE); break; case SUCCESS_TYPE: mSuccessFrame.setVisibility(View.VISIBLE); // initial rotate layout of success mask mSuccessLeftMask.startAnimation(mSuccessLayoutAnimSet.getAnimations().get(0)); mSuccessRightMask.startAnimation(mSuccessLayoutAnimSet.getAnimations().get(1)); break; case WARNING_TYPE: mConfirmButton.setBackgroundResource(R.drawable.red_button_background); mWarningFrame.setVisibility(View.VISIBLE); break; case CUSTOM_IMAGE_TYPE: setCustomImage(mCustomImgDrawable); break; case PROGRESS_TYPE: mProgressFrame.setVisibility(View.VISIBLE); mConfirmButton.setVisibility(View.GONE); break; } if (!fromCreate) { playAnimation(); } } } public int getAlerType () { return mAlertType; } public void changeAlertType(int alertType) { changeAlertType(alertType, false); } public String getTitleText () { return mTitleText; } public SweetAlertDialog setTitleText (String text) { mTitleText = text; if (mTitleTextView != null && mTitleText != null) { mTitleTextView.setText(mTitleText); } return this; } public SweetAlertDialog setCustomImage (Drawable drawable) { mCustomImgDrawable = drawable; if (mCustomImage != null && mCustomImgDrawable != null) { mCustomImage.setVisibility(View.VISIBLE); mCustomImage.setImageDrawable(mCustomImgDrawable); } return this; } public SweetAlertDialog setCustomImage (int resourceId) { return setCustomImage(getContext().getResources().getDrawable(resourceId)); } public String getContentText () { return mContentText; } public SweetAlertDialog setContentText (String text) { mContentText = text; if (mContentTextView != null && mContentText != null) { showContentText(true); mContentTextView.setText(mContentText); } return this; } public boolean isShowCancelButton () { return mShowCancel; } public SweetAlertDialog showCancelButton (boolean isShow) { mShowCancel = isShow; if (mCancelButton != null) { mCancelButton.setVisibility(mShowCancel ? View.VISIBLE : View.GONE); } return this; } public boolean isShowContentText () { return mShowContent; } public SweetAlertDialog showContentText (boolean isShow) { mShowContent = isShow; if (mContentTextView != null) { mContentTextView.setVisibility(mShowContent ? View.VISIBLE : View.GONE); } return this; } public String getCancelText () { return mCancelText; } public SweetAlertDialog setCancelText (String text) { mCancelText = text; if (mCancelButton != null && mCancelText != null) { showCancelButton(true); mCancelButton.setText(mCancelText); } return this; } public String getConfirmText () { return mConfirmText; } public SweetAlertDialog setConfirmText (String text) { mConfirmText = text; if (mConfirmButton != null && mConfirmText != null) { mConfirmButton.setText(mConfirmText); } return this; } public SweetAlertDialog setCancelClickListener (OnSweetClickListener listener) { mCancelClickListener = listener; return this; } public SweetAlertDialog setConfirmClickListener (OnSweetClickListener listener) { mConfirmClickListener = listener; return this; } protected void onStart() { mDialogView.startAnimation(mModalInAnim); playAnimation(); } /** * The real Dialog.cancel() will be invoked async-ly after the animation finishes. */ @Override public void cancel() { dismissWithAnimation(true); } /** * The real Dialog.dismiss() will be invoked async-ly after the animation finishes. */ public void dismissWithAnimation() { dismissWithAnimation(false); } private void dismissWithAnimation(boolean fromCancel) { mCloseFromCancel = fromCancel; mConfirmButton.startAnimation(mOverlayOutAnim); mDialogView.startAnimation(mModalOutAnim); } @Override public void onClick(View v) { if (v.getId() == R.id.cancel_button) { if (mCancelClickListener != null) { mCancelClickListener.onClick(SweetAlertDialog.this); } else { dismissWithAnimation(); } } else if (v.getId() == R.id.confirm_button) { if (mConfirmClickListener != null) { mConfirmClickListener.onClick(SweetAlertDialog.this); } else { dismissWithAnimation(); } } } public ProgressHelper getProgressHelper () { return mProgressHelper; } }