1. 程式人生 > >自定義Dialog設定全屏顯示和背景透明

自定義Dialog設定全屏顯示和背景透明

因為公司業務需要,需要在每一個頁面請求網路的時候,顯示載入中的動畫,當請求完畢時,需要隱藏動畫,所以考慮自定義一個Dialog放在BaseActivity中,在BaseActivity中暴露出來兩個方法,一個用於顯示載入動畫,一個用來隱藏載入動畫。在這裡考慮使用幀動畫實現。

自定義Dialog的佈局檔案:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/loadingIv"
        android:layout_width="@dimen/dp_60"
        android:layout_height="@dimen/dp_60"
        android:layout_centerInParent="true"
        android:background="@drawable/animation_loading_running" />

    <TextView
        android:id="@+id/loadingTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/loadingIv"
        android:layout_centerInParent="true"
        android:textColor="@color/white"
        android:textSize="@dimen/sp_14"
        tools:text="正在載入中..." />

</RelativeLayout>

效果圖如下(動圖略小。。。):


幀動畫布局檔案如下,其實就是7張連續的圖片:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<!--網路載入中動畫-->
<item
android:drawable="@mipmap/ic_loading_run01"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run02"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run03"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run04"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run05"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run06"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run07"
android:duration="150" />
</animation-list>


自定義Dialog類如下:

package cn.oneday.customloadingdialog;

import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * @Description:自定義載入框
 */
public class CustomProgressDialog extends ProgressDialog {
    private AnimationDrawable mAnimation;
    private Context mContext;
    private ImageView mImageView;
    private String mLoadingTip;
    private TextView mLoadingTv;
    private int mResid;

    public CustomProgressDialog(Context context, String content, int theme, int id) {
        super(context, theme);
        this.mContext = context;
        this.mLoadingTip = content;
        this.mResid = id;
        setCanceledOnTouchOutside(false);// 設定不能點選對話方塊外邊取消當前對話方塊
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        initData();
    }

    private void initData() {
        mImageView.setBackgroundResource(mResid);
        // 通過ImageView物件拿到背景顯示的AnimationDrawable  
        mAnimation = (AnimationDrawable) mImageView.getBackground();
        // 為了防止在onCreate方法中只顯示第一幀的解決方案之一  
        mImageView.post(new Runnable() {
            @Override
            public void run() {
                mAnimation.start();

            }
        });
        mLoadingTv.setText(mLoadingTip);
    }

    public void setContent(String str) {
        mLoadingTv.setText(str);
    }

    private void initView() {
        setContentView(R.layout.progress_loading_dialog);
        mLoadingTv = (TextView) findViewById(R.id.loadingTv);
        mImageView = (ImageView) findViewById(R.id.loadingIv);
    }
}  
因為自定義的Dialog預設在佈局檔案中設定的寬高是沒有效果的,所以需要在程式碼中動態的設定Dialog的寬和高。
在Activity中使用:
package cn.oneday.customloadingdialog;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Display;
import android.view.WindowManager;

public class MainActivity extends AppCompatActivity {
    private CustomProgressDialog customProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        customProgressDialog = new CustomProgressDialog(this, "拼命載入中...", R.style.Dialog_Fullscreen, R.drawable.animation_loading_running);
        // customProgressDialog.setCancelable(false); // 設定不響應返回按鈕點選事件
        customProgressDialog.show();

        // 動態設定自定義Dialog的顯示內容的寬和高
        WindowManager m = getWindowManager();
        Display d = m.getDefaultDisplay();  //為獲取螢幕寬、高
        android.view.WindowManager.LayoutParams p = customProgressDialog.getWindow().getAttributes();  //獲取對話方塊當前的引數值
        p.height = (int) (d.getHeight() * 0.3);   //高度設定為螢幕的0.3
        p.width = d.getWidth();    //寬度設定為全屏
        customProgressDialog.getWindow().setAttributes(p);     //設定生效
    }
}
自定義對話方塊樣式,在佈局檔案中設定沒有效果,需要在建立對話方塊物件時指定才能生效:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--載入進度對話方塊樣式-->
    <style name="Dialog_Fullscreen">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item><!--是否浮現在activity之上-->
        <item name="android:windowIsTranslucent">false</item><!--半透明-->
        <item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
        <item name="android:backgroundDimEnabled">true</item><!--模糊-->
    </style>
</resources>


以此記錄,方便以後查閱,如有錯誤,請指正,萬分感謝!