收藏一個Dialog基類,能夠本身定義任意佈局,方便爲其子View增長點擊事件和設置文字

Dialog主體

  1. BaseDialog.java
package com.koolearn.android.ui.dialog;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.koolearn.android.R;
import com.koolearn.android.utils.Log;

import java.util.HashMap;
import java.util.Map;


public class BaseDialog extends Dialog {
    private Context mContext;
    private int mHeight, mWidth, mGravity;
    private boolean mOnTouchCanceled;
    private View mView;
    private int mStyleAnimation;
    private int mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBotton;

    public BaseDialog(Builder builder) {
        super(builder.bContext);
    }

    public BaseDialog(Builder builder, int themeResId) {
        super(builder.bContext, themeResId);
        mContext = builder.bContext;
        mHeight = builder.bHeight;
        mWidth = builder.bWidth;
        mView = builder.bView;
        mGravity = builder.bGravity;
        mStyleAnimation = builder.bStyleAnimation;
        mOnTouchCanceled = builder.bOnTouchCanceled;
        mPaddingLeft = builder.bPaddingLeft;
        mPaddingTop = builder.bPaddingTop;
        mPaddingRight = builder.bPaddingRight;
        mPaddingBotton = builder.bPaddingBotton;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(mView);
        setCanceledOnTouchOutside(mOnTouchCanceled);
        Window window = getWindow();
        if (mPaddingLeft != -11111) {
            window.getDecorView().setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBotton);
        }
        if (mStyleAnimation != -11111) {
            window.setWindowAnimations(mStyleAnimation);
        }
        WindowManager.LayoutParams layoutParams = window.getAttributes();
        layoutParams.gravity = mGravity != -11111 ? mGravity : Gravity.CENTER;
        layoutParams.width = mWidth != -11111 ? mWidth : LinearLayout.LayoutParams.WRAP_CONTENT;
        layoutParams.height = mHeight != -11111 ? mHeight : LinearLayout.LayoutParams.WRAP_CONTENT;
        window.setAttributes(layoutParams);
    }

    public static final class Builder {
        private Context bContext;
        private int bHeight = -11111, bWidth = -11111;
        private int bGravity = -11111;
        private boolean bOnTouchCanceled;
        private View bView;
        private int bThemeResId = R.style.w_dialog_style;
        private int bStyleAnimation = -11111;
        private int bPaddingLeft = -11111, bPaddingTop, bPaddingRight, bPaddingBotton;
        private HashMap<Integer, View.OnClickListener> normalClickMap = new HashMap<>();
        private HashMap<Integer, View.OnClickListener> dismissClickMap = new HashMap<>();
        private BaseDialog baseDialog;

        public Builder(Context mContext) {
            this.bContext = mContext;
        }

        public Builder setViewId(int viewId) {
            this.bView = LayoutInflater.from(bContext).inflate(viewId, null);
            return this;
        }

        public Builder setWidthHeightpx(int whidth, int height) {
            this.bWidth = whidth;
            this.bHeight = height;
            return this;
        }
        public Builder setWidthHeightDp(int whidth, int height) {
            this.bWidth = dip2px(bContext, whidth);
            this.bHeight = dip2px(bContext, height);
            return this;
        }

        public Builder isOnTouchCanceled(boolean var) {
            this.bOnTouchCanceled = var;
            return this;
        }

        public Builder setChildViewClickListener(int viewId, boolean isDialogDismiss, View.OnClickListener listener){
            if(bView==null){
                Log.e("BaseDialog","bView can't be null,this method must be called after setViewId()");
                return this;
            }
            if(isDialogDismiss){
                bView.findViewById(viewId).setOnClickListener(v->{
                    if(baseDialog!=null){
                        baseDialog.close();
                        listener.onClick(v);
                    }
                });
            }else{
                bView.findViewById(viewId).setOnClickListener(listener);
            }
            return this;
        }

        public Builder setChildTextViewText(int viewId, String text){
            if(bView==null){
                Log.e("BaseDialog","bView can't be null,this method must be called after setViewId()");
                return this;
            }
            View v=bView.findViewById(viewId);
            if (v instanceof TextView){
                ((TextView)v).setText(text);
            }
            return this;
        }

        public Builder setChildTextViewText(int viewId, int textResId){
            if(bView==null){
                Log.e("BaseDialog","bView can't be null,this method must be called after setViewId()");
                return this;
            }
            View v=bView.findViewById(viewId);
            if (v instanceof TextView){
                ((TextView)v).setText(textResId);
            }
            return this;
        }

        public Builder setStyle(int themeResId) {
            this.bThemeResId = themeResId;
            return this;
        }

        public Builder setGravity(int gravity) {
            this.bGravity = gravity;
            return this;
        }

        public Builder setAnimation(int styleAnimation) {
            this.bStyleAnimation = styleAnimation;
            return this;
        }

        public Builder setPaddingDp(int paddingLeft, int paddingTop, int paddingRight, int paddingBotton) {
            this.bPaddingLeft = dip2px(bContext, paddingLeft);
            this.bPaddingTop = dip2px(bContext, paddingTop);
            this.bPaddingRight = dip2px(bContext, paddingRight);
            this.bPaddingBotton = dip2px(bContext, paddingBotton);
            return this;
        }

        public Builder setPaddingPx(int paddingLeft, int paddingTop, int paddingRight, int paddingBotton) {
            this.bPaddingLeft = paddingLeft;
            this.bPaddingTop = paddingTop;
            this.bPaddingRight = paddingRight;
            this.bPaddingBotton = paddingBotton;
            return this;
        }

        public BaseDialog builder() {
            baseDialog = new BaseDialog(this, bThemeResId);
            return baseDialog;
        }

        public <T extends View> T getView(int resId) {
            if (bView != null) {
                return (T) bView.findViewById(resId);
            }
            return null;
        }
    }

    public void close() {
        if (!((Activity) mContext).isFinishing()) {
            ((Activity) mContext).runOnUiThread(()->{
                if (isShowing()) {
                    dismiss();
                }
            });
        }
    }

    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

}

複製代碼

幾個dialog能夠設置的動畫

  1. right_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:duration="500"
        android:fromXDelta="100%p"
        />
</set>
複製代碼
  1. right_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:toXDelta="100%p"
        />
</set>
複製代碼
  1. alpha_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="500"
        android:fromAlpha="0.0"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toAlpha="1.0" />
</set>
複製代碼
  1. alpha_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="500"
        android:fromAlpha="1.0"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toAlpha="0" />

</set>
複製代碼
  1. bottom_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fromYDelta="100%p"
        />

</set>
複製代碼
  1. bottom_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:toYDelta="100%p"
        />

</set>
複製代碼
  1. left_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:duration="500"
        android:fromXDelta="-100%p"
        />
</set>
複製代碼
  1. left_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:toXDelta="-100%p"
        />
</set>
複製代碼
  1. top_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fromYDelta="-100%p"
        />

</set>
複製代碼
  1. top_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:toYDelta="-100%p"
        />

</set>
複製代碼
  1. scale_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:fromXScale="0"
        android:fromYScale="0"
        android:toXScale="1.0"
        android:toYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="500"
        />

</set>
複製代碼
  1. scale_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="0"
        android:toYScale="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="500"
        />

</set>
複製代碼

style

<!--dialog style屬性-->
    <style name="w_dialog_style" parent="@android:style/Theme.Dialog">
        <!--//Dialog的windowFrame框爲無-->
        <item name="android:windowFrame">@null</item>
        <!--//是否浮如今activity之上-->
        <item name="android:windowIsFloating">true</item>
        <!--//是否半透明-->
        <item name="android:windowIsTranslucent">true</item>
        <!--//是否顯示title-->
        <item name="android:windowNoTitle">true</item>
        <!--//設置dialog的背景-->
        <item name="android:background">@android:color/transparent</item>
        <!--//顯示區域背景是否透明-->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!--//就是用來控制灰度的值,當爲1時,界面除了咱們的dialog內容是高亮顯示的,dialog之外的區域是黑色的,徹底看不到其餘內容,系統的默認值是0.5-->
        <item name="android:backgroundDimAmount">0.5</item>
        <!--//顯示區域之外是否使用黑色半透明背景-->
        <item name="android:backgroundDimEnabled">true</item>
    </style>
    <!--dialog 從下往上彈出動畫-->
    <style name="Bottom_Top_aniamtion">
        <item name="android:windowEnterAnimation">@anim/bottom_in</item>
        <item name="android:windowExitAnimation">@anim/bottom_out</item>
    </style>
    <!--dialog 從上往下彈出動畫-->
    <style name="Top_Bottom_aniamtion">
        <item name="android:windowEnterAnimation">@anim/top_in</item>
        <item name="android:windowExitAnimation">@anim/top_out</item>
    </style>
    <!--dialog 從左往右彈出動畫-->
    <style name="Left_Right_aniamtion">
        <item name="android:windowEnterAnimation">@anim/left_in</item>
        <item name="android:windowExitAnimation">@anim/left_out</item>
    </style>

    <!--dialog 從左往右彈出動畫-->
    <style name="Right_Left_aniamtion">
        <item name="android:windowEnterAnimation">@anim/right_in</item>
        <item name="android:windowExitAnimation">@anim/right_out</item>
    </style>

    <!--dialog 透明彈出動畫-->
    <style name="Alpah_aniamtion">
        <item name="android:windowEnterAnimation">@anim/alpha_in</item>
        <item name="android:windowExitAnimation">@anim/alpha_out</item>
    </style>

    <!--dialog 縮放彈出動畫-->
    <style name="Scale_aniamtion">
        <item name="android:windowEnterAnimation">@anim/scale_in</item>
        <item name="android:windowExitAnimation">@anim/scale_out</item>
    </style>
複製代碼
相關文章
相關標籤/搜索