自定義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類如下:
因為自定義的Dialog預設在佈局檔案中設定的寬高是沒有效果的,所以需要在程式碼中動態的設定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); } }
在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>
以此記錄,方便以後查閱,如有錯誤,請指正,萬分感謝!