Dialog主體
- 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能夠設置的動畫
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼
- 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>
複製代碼