首先自定义一个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了。