自定義的dailog

在這裏插入圖片描述
首先自定義一個view

package forever.chenxiao.com.mytest;


import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.Display;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.KeyboardShortcutGroup;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import java.util.ArrayList;
import java.util.List;


public class CustomDialog extends Dialog implements View.OnClickListener {
    private Context context;      // 上下文
    private int mLayoutResId;      // 佈局文件id
    private int[] mIds = new int[]{};  // 要監聽的控件id
    private int mAnimationResId = 0;//主題style
    private boolean dl_style = false;
    private OnCustomDialogItemClickListener listener;
    private boolean mIsDismiss = true;//是否默認所有按鈕點擊後取消dialog顯示,false時需要在點擊事件後手動調用dismiss
    public boolean mIsDismissTouchOut = true;//是否允許觸摸dialog外部區域取消顯示dialog
    private int mPosition = 0; //Dialog 相對頁面顯示的位置
    private List<View> mViews = new ArrayList<>();//監聽的View的集合

    public boolean ismIsDismissTouchOut() {
        return mIsDismissTouchOut;
    }

    public void setmIsDismissTouchOut(boolean mIsDismissTouchOut) {
        this.mIsDismissTouchOut = mIsDismissTouchOut;
    }

    public void setOnDialogItemClickListener(OnCustomDialogItemClickListener listener) {
        this.listener = listener;
    }

    public CustomDialog(Context context, int layoutResID) {
        super(context, R.style.Custom_Dialog_Style);
        this.context = context;
        this.mLayoutResId = layoutResID;

    }

    public CustomDialog(Context context, int layoutResID, int[] listenedItems) {
        super(context, R.style.Custom_Dialog_Style); //dialog的樣式
        this.context = context;
        this.mLayoutResId = layoutResID;
        this.mIds = listenedItems;
    }

    public CustomDialog(Context context, int layoutResID, int[] listenedItems, int animationResId) {
        super(context, R.style.Custom_Dialog_Style); //dialog的樣式
        this.context = context;
        this.mLayoutResId = layoutResID;
        this.mIds = listenedItems;
        this.mAnimationResId = animationResId;
    }

    public CustomDialog(Context context, int layoutResID, int[] listenedItems, boolean isDismiss) {
        super(context, R.style.Custom_Dialog_Style); //dialog的樣式
        this.context = context;
        this.mLayoutResId = layoutResID;
        this.mIds = listenedItems;
        this.mIsDismiss = isDismiss;
    }

    public CustomDialog(Context context, int layoutResID, int[] listenedItems, boolean isDismiss, boolean isDismissTouchOut) {
        super(context, R.style.Custom_Dialog_Style); //dialog的樣式
        this.context = context;
        this.mLayoutResId = layoutResID;
        this.mIds = listenedItems;
        this.mIsDismiss = isDismiss;
        this.mIsDismissTouchOut = isDismissTouchOut;
    }

    public CustomDialog(Context context, int layoutResID, int[] listenedItems, boolean isDismiss,
                        boolean isDismissTouchOut, boolean dl_style) {
        super(context,R.style.Custom_Dialog_Style2); //dialog的樣式
        this.context = context;
        this.mLayoutResId = layoutResID;
        this.mIds = listenedItems;
        this.mIsDismiss = isDismiss;
        this.mIsDismissTouchOut = isDismissTouchOut;
        this.mAnimationResId = R.style.dialogWindowAnim;
        this.dl_style = dl_style;
    }

    public CustomDialog(Context context, int layoutResID, int[] listenedItems, boolean isDismiss, int position) {
        super(context, R.style.Custom_Dialog_Style); //dialog的樣式
        this.context = context;
        this.mLayoutResId = layoutResID;
        this.mIds = listenedItems;
        this.mIsDismiss = isDismiss;
        this.mPosition = position;
    }


    /**
     * @param context
     * @param layoutResID       佈局Id
     * @param ids               需要監聽的View id集合
     * @param animationResId    動畫資源id
     * @param isDismiss         是否默認點擊所有View 取消dialog顯示
     * @param isDismissTouchOut 是否觸摸dialog外部區域消失dialog顯示
     * @param position          dialog顯示的位置
     */
    public CustomDialog(Context context,
                        int layoutResID,
                        int[] ids,
                        int animationResId,
                        boolean isDismiss,
                        boolean isDismissTouchOut,
                        int position) {
        super(context, R.style.Custom_Dialog_Style);
        this.context = context;
        this.mLayoutResId = layoutResID;
        this.mIds = ids;
        this.mAnimationResId = animationResId;
        this.mIsDismiss = isDismiss;
        this.mIsDismissTouchOut = isDismissTouchOut;
        this.mPosition = position;

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window window = getWindow();
        if (0 == mPosition) {
            window.setGravity(Gravity.CENTER); // dialog默認顯示的位置爲居中
        } else {
            window.setGravity(mPosition);// 設置自定義的dialog位置
        }

        if (!dl_style){
            if (mAnimationResId == 0) {
                window.setWindowAnimations(R.style.bottom_animation); // 添加默認動畫效果
            } else {
                window.setWindowAnimations(mAnimationResId);//添加自定義動畫
            }
        }

        setContentView(mLayoutResId);

        WindowManager windowManager = ((Activity) context).getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.width = display.getWidth(); // 設置dialog寬度爲屏幕的4/5
        getWindow().setAttributes(lp);
        setCanceledOnTouchOutside(mIsDismissTouchOut);
        //遍歷控件id,添加點擊事件,添加資源到集合
        for (int id : mIds) {
            View view = findViewById(id);
            view.setOnClickListener(this);
            mViews.add(view);
        }
    }

    /**
     * 獲取需要監聽的View集合
     *
     * @return
     */
    public List<View> getViews() {
        return mViews;
    }

    @Override
    public void onProvideKeyboardShortcuts(List<KeyboardShortcutGroup> data, @Nullable Menu menu, int deviceId) {

    }

    public interface OnCustomDialogItemClickListener {
        void OnCustomDialogItemClick(CustomDialog dialog, View view);
    }


    @Override
    public void onClick(View view) {
        //是否默認所有按鈕點擊後取消dialog顯示,false是需要在點擊事件後手動調用dismiss。
        if (mIsDismiss) {
            dismiss();
        }
        listener.OnCustomDialogItemClick(this, view);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            if (ismIsDismissTouchOut()){
                return super.onKeyDown(keyCode, event);
            }else{
                return false;
            }
        } else {
            return super.onKeyDown(keyCode, event);
        }
    }
}

然後在res下的style裏添加

<style name="Custom_Dialog_Style" parent="@android:style/Theme.Dialog">
        <!--窗口背景色透明-->
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <!--是否浮在界面上-->
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowFrame">@null</item>
        <!-- 是否允許背景變暗 --> <!--背景是否模糊顯示-->
        <item name="android:backgroundDimEnabled">true</item>
        <!--是否有標題-->
        <item name="android:windowNoTitle">true</item>
        <!--是否半透明-->
        <item name="android:windowIsTranslucent">true</item>
    </style>

    <style name="Custom_Dialog_Style2" parent="@android:style/Theme.Dialog">
        <!--窗口背景色透明-->
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <!--是否浮在界面上-->
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowFrame">@null</item>
        <!-- 是否允許背景變暗 --> <!--背景是否模糊顯示-->
        <item name="android:backgroundDimEnabled">false</item>
        <!--是否有標題-->
        <item name="android:windowNoTitle">true</item>
        <!--是否半透明-->
        <item name="android:windowIsTranslucent">true</item>
    </style>

    <style name="dialogWindowAnim" parent="android:Animation" mce_bogus="1">
        <item name="android:windowEnterAnimation">@anim/dialog_enter_anim</item>
        <item name="android:windowExitAnimation">@anim/dialog_exit_anim</item>
    </style>

    <!-- dialog底部彈出菜單動畫 -->
    <style name="bottom_animation" parent="android:Animation">
        <item name="android:windowEnterAnimation">@anim/bottom_enter</item>
        <item name="android:windowExitAnimation">@anim/bottom_exit</item>
    </style>

然後在res下加入一個anim文件夾,添加如下代碼

dialog_enter_anim

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.0"
        android:fromYScale="0.0"
        android:toYScale="1.0"
        android:pivotX="0%"
        android:pivotY="100%"
        android:fillAfter="false"
        android:duration="400"/>
</set>

dialog_exit_anim

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.0"
        android:fromYScale="1.0"
        android:toYScale="0.0"
        android:pivotX="0%"
        android:pivotY="100%"
        android:fillAfter="false"
        android:duration="400"/>
</set>

bottom_enter

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="400"
        android:fromYDelta="100%p" />
</set>

bottom_exit

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="600"
        android:toYDelta="100%p" />
</set>

接下來就是如何使用了,在activity聲明一個

private CustomDialog show_dialog;

然後寫個方法

public void showDialog() {
        if (null == show_dialog) {
            show_dialog = new CustomDialog(this, R.layout.show_dialog,
                    new int[]{R.id.linearlayout, R.id.tv_yes},
                    false,
                    Gravity.CENTER);

            show_dialog.setOnDialogItemClickListener(new CustomDialog.OnCustomDialogItemClickListener() {
                @Override
                public void OnCustomDialogItemClick(CustomDialog dialog, View view) {

                    switch (view.getId()) {
                        case R.id.tv_yes:
                            dialog.dismiss();
                            break;
                    }
                }
            });
        }

        show_dialog.setmIsDismissTouchOut(false);
        show_dialog.show();
    }

在需要彈出的地方調用這個方法

佈局文件show_dialog

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/linearlayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#ffff"
        android:padding="20dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="2dp"
                android:gravity="center"
                android:text="標題"
                android:textColor="#333333"
                android:textSize="15sp" />

        </RelativeLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:layout_marginTop="10dp"
            android:background="#A0A0A0" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:lineSpacingExtra="10dp"
            android:text="內容"
            android:textColor="#333333"
            android:textSize="13sp" />

        <TextView
            android:id="@+id/tv_yes"
            android:layout_width="170dp"
            android:layout_height="44dp"
            android:layout_gravity="center_horizontal|bottom"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:text="知道了"
            android:textColor="#FE4226"
            android:textSize="15sp" />

    </LinearLayout>

</LinearLayout>

如此就OK了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章