自定義dialog彈框效果
阿新 • • 發佈:2019-01-28
自定義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的實體類物件:
public class MainActivity extends Activity implements OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.mBtnSetLock).setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { //彈出dialog showMyDialog() } }); } private void showMyDialog() { //獲取實體類 final AccountDialog mAccountDialog=AccountDialog.getMyDialog(MainActivity.this); //可以設定很大不同的動畫 //mAccountDialog.getWindow().setWindowAnimations(R.style.Dialog_Anim_Style); mAccountDialog.getWindow().setWindowAnimations(R.style.Dialog_Anim_Style2); //回撥實現點選 mAccountDialog.setSettingDialogCallBack(new AccountDialog.SettingDialogCallBack() { @Override public void onActionClick(int id) { switch (id){ case 1: if(mAccountDialog!=null&&mAccountDialog.isShowing()){ mAccountDialog.dismiss(); } break; case 2: if(mAccountDialog!=null&&mAccountDialog.isShowing()){ mAccountDialog.dismiss(); } break; } } }); mAccountDialog.show(); } }
這裡面引用了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>
哦了。沒什麼難點。效果圖!請忽視其他的