1. 程式人生 > >自定義dialog彈框效果

自定義dialog彈框效果

自定義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>

哦了。沒什麼難點。效果圖!請忽視其他的