自定义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>
<?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>
哦了。没什么难点。效果图!请忽视其他的