自定义dialog弹框效果

时间:2022-05-17 20:40:15

自定义dialog及动画效果

通常项目中会用到比较特殊的弹框,则就需要自定义写一个dialog,需要重新画个布局添加到dialog中。这里就需要自定义一个Dialog类继承与Dialog。也有可能需要动画效果来增加UI效果。

直接上代码:

package com.wujay.fund;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;



public class AccountDialog extends Dialog {

private static Context context = null;
private static AccountDialog myDialog = null;
private TextView dialog_cancel;
private TextView dialog_ok;
private SettingDialogCallBack settingDialogCallBack;

public AccountDialog(Context context, int theme) {
super(context, theme);
}

/***
*
* @param context 传入的上下文
* @return AccountDialog 返回dialog对象
*/
public static AccountDialog getMyDialog(Context context) {
AccountDialog.context = context;
myDialog = new AccountDialog(context, R.style.qmm_dialog);// 创建自定义样式dialog
myDialog.setContentView(R.layout.account_dialog);// 得到加载view
myDialog.getWindow().getAttributes().gravity = Gravity.CENTER;//设置显示位置为居中
myDialog.setCanceledOnTouchOutside(true);//是否可以用返回键取消
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(true);//点击对话框以外不关闭
return myDialog;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化UI
initUI();
}

private void initUI() {
dialog_cancel = (TextView) myDialog.findViewById(R.id.dialog_cancel);
dialog_ok = (TextView) myDialog.findViewById(R.id.dialog_ok);
dialog_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//这里可以为布局上其他的控件设置监听,添加不同的id传值就行。用来回调
settingDialogCallBack.onActionClick(1);//点击button为1
}
});
dialog_ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//这里可以为布局上其他的控件设置监听,添加不同的id传值就行.用来回调
settingDialogCallBack.onActionClick(2);//点击button为2
}
});
}

@Override
public void show() {
if (context != null) {
super.show();
}
}

@Override
public void dismiss() {
super.dismiss();
}

public void onWindowFocusChanged(boolean hasFocus) {

if (myDialog == null) {
return;
}
if (!hasFocus) {
dismiss();
}


}

/**
* [Summary] setMessage 提示内容
*
* @param strMessage
* @return
*/
public AccountDialog setMessage(String strMessage) {
TextView tvMsg = (TextView) myDialog.findViewById(R.id.dialog_title);
if (tvMsg != null) {
tvMsg.setText(strMessage);
}
return myDialog;
}

/**
* 是否可以用返回键取消
*
* @param cancel
*/
public void isBackUndo(boolean cancel) {
myDialog.setCancelable(cancel);
}

public interface SettingDialogCallBack {
/**
* 事件点击
* @param id 返回点击按键的id
*/
public void onActionClick (int id);
}
/**
* 接口回调
* @param settingDialogCallBack
*/
public void setSettingDialogCallBack(SettingDialogCallBack settingDialogCallBack) {
this.settingDialogCallBack = settingDialogCallBack;
}
}

这里用到style样式:

<style name="qmm_dialog" parent="android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/alert_dialog_bg</item>
<item name="android:windowNoTitle">true</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsFloating">true</item
><!-- 是否浮现在activity之上 -->
</style>


在Activity中调用,获取dialog的实体类对象:



这里面引用了dialog动画效果,主要是这个

mAccountDialog.getWindow().setWindowAnimations(R.style.Dialog_Anim_Style2);

实现的。setWindowAnimations是设置窗口弹出动画的。跟Activity切换动画效果是一样的。

<style name="Dialog_Anim_Style2" parent="android:Animation" >
<item name="@android:windowEnterAnimation">@anim/push_bottom_in1</item> //进入时的动画
<item name="@android:windowExitAnimation">@anim/push_bottom_out1</item> //退出时的动画
</style>


anim里面的动画:(可以随意换自己想要的动画效果)

<?xml version="1.0" encoding="utf-8"?>
<!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate
android:duration="500"
android:fromYDelta="50%p"
android:toYDelta="0" />

<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="500" />

</set>
<?xml version="1.0" encoding="utf-8"?><!-- 上下滑入式 --><set xmlns:android="http://schemas.android.com/apk/res/android" >        <translate        android:duration="500"        android:fromYDelta="0"        android:toYDelta="50%p" />    <alpha        android:fromAlpha="1.0"    android:toAlpha="0.0"    android:duration="500" />    </set>

哦了。没什么难点。效果图!请忽视其他的

自定义dialog弹框效果