国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義Dialog實現加載對話框效果

2019-12-12 00:55:16
字體:
來源:轉載
供稿:網友

前言

最近開發中用到許多對話框,之前都是在外面的代碼中創建AlertDialog并設置自定義布局實現常見的對話框,諸如更新提示等含有取消和刪除兩個按鈕的對話框我們可以通過代碼創建一個AlertDialog并通過它暴露的一系列方法設置我們自定義的布局和style,但有時候系統的AlertDialog并不能實現更好的定制,這時,我們就想到了自定義Dialog。通過查看AlertDialog的類結構發現它也是繼承于Dialog,于是我們也可以通過繼承Dialog實現我們自定義的Dialog。這篇文章將介紹如何定制當今主流的對話框,先上效果圖,給大家養養眼。

這里寫圖片描述這里寫圖片描述

代碼實現

1、編寫自定義布局,dialog_loading.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"       android:orientation="vertical"       android:layout_width="match_parent"       android:gravity="center"       android:background="@drawable/bg_loading_dialog"       android:layout_height="match_parent">  <ImageView    android:id="@+id/iv_loading"    android:layout_width="wrap_content"    android:src="@mipmap/ic_dialog_loading"    android:layout_height="wrap_content"/>  <TextView    android:id="@+id/tv_loading"    android:layout_width="wrap_content"    android:layout_marginTop="20dp"    android:text="@string/loading"    android:textSize="16sp"    android:textColor="@android:color/white"    android:layout_height="wrap_content"/></LinearLayout>

2、繼承Dialog,覆蓋構造方法

public class LoadingDialog extends Dialog {  private static final String TAG = "LoadingDialog";  private String mMessage; // 加載中文字  private int mImageId; // 旋轉圖片id  private boolean mCancelable;  private RotateAnimation mRotateAnimation;  public LoadingDialog(@NonNull Context context,String message,int imageId) {    this(context,R.style.LoadingDialog,message,imageId,false);  }  public LoadingDialog(@NonNull Context context, int themeResId,String message,int imageId,boolean cancelable) {    super(context, themeResId);    mMessage = message;    mImageId = imageId;    mCancelable = cancelable;  }}

3、覆蓋onCreate(),初始化控件

@Overrideprotected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  initView();}private void initView() {  setContentView(R.layout.dialog_loading);  // 設置窗口大小  WindowManager windowManager = getWindow().getWindowManager();  int screenWidth = windowManager.getDefaultDisplay().getWidth();  WindowManager.LayoutParams attributes = getWindow().getAttributes();  // 設置窗口背景透明度  attributes.alpha = 0.3f;  // 設置窗口寬高為屏幕的三分之一(為了更好地適配,請別直接寫死)  attributes.width = screenWidth/3;  attributes.height = attributes.width;  getWindow().setAttributes(attributes);  setCancelable(mCancelable);  TextView tv_loading = findViewById(R.id.tv_loading);  ImageView iv_loading = findViewById(R.id.iv_loading);  tv_loading.setText(mMessage);  iv_loading.setImageResource(mImageId);  // 先對imageView進行測量,以便拿到它的寬高(否則getMeasuredWidth為0)  iv_loading.measure(0,0);  // 設置選擇動畫  mRotateAnimation = new RotateAnimation(0,360,iv_loading.getMeasuredWidth()/2,iv_loading.getMeasuredHeight()/2);  mRotateAnimation.setInterpolator(new LinearInterpolator());  mRotateAnimation.setDuration(1000);  mRotateAnimation.setRepeatCount(-1);  iv_loading.startAnimation(mRotateAnimation);}

以上代碼需要注意設置動畫旋轉中心坐標為我們imageView的中心點,需要先對imageView進行測量,同時初始化布局的操作請放在onCreate()方法中(別直接在構造方法中初始化布局,這樣可以在Dialog要顯示的時候才初始化,即調用show方法)。

4、其他

@Overridepublic void dismiss() {  mRotateAnimation.cancel();  super.dismiss();}@Overridepublic boolean onKeyDown(int keyCode, @NonNull KeyEvent event) {  if(keyCode == KeyEvent.KEYCODE_BACK){    // 屏蔽返回鍵    return mCancelable;  }  return super.onKeyDown(keyCode, event);}

這一步需要注意的是我們Dialog在顯示的時候就會無限重復(setRepeatCount(-1))執行旋轉動畫,因此在Dialog消失的時候我們要取消動畫,而屏蔽返回鍵則是為了更好地讓窗口的關閉被我們的mCancelable控制。

看到這里你或許想知道我們設置的布局背景drawable,如下:

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">  <corners android:radius="10dp"></corners>  <solid android:color="@android:color/black"/></shape>

你可以自己設置你想要的圓角大小,也可以設置背景顏色(會被透明處理,根據我們為窗口設置的透明度)。

當然,仔細的你會發現我們還少了一些必要的配置,那就是窗口的style,如下:

<style name="LoadingDialog" parent="@android:style/Theme.Holo.Dialog.NoActionBar">  <item name="android:windowBackground">@android:color/transparent</item>  <item name="android:backgroundDimEnabled">false</item></style>

•android:windowBackground:設置窗口的背景,這里設為透明;
•android:backgroundDimEnabled:設置窗口是否變暗(true變暗,false不變暗,見效果圖1和2)。

最后奉上這篇文章的github:https://github.com/ydxlt/LoadingDialog

總結

以上所述是小編給大家介紹的Android自定義Dialog實現加載對話框效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通榆县| 大荔县| 汶川县| 德化县| 瓦房店市| 同仁县| 保靖县| 中超| 怀来县| 韶关市| 博兴县| 华坪县| 扎兰屯市| 屏山县| 光山县| 崇左市| 鄱阳县| 喀喇沁旗| 洪洞县| 陕西省| 乐昌市| 民和| 衡南县| 故城县| 随州市| 怀柔区| 青州市| 清涧县| 盘山县| 金湖县| 宜丰县| 江北区| 广宁县| 汝南县| 东莞市| 达拉特旗| 长宁区| 涞源县| 剑阁县| 巩留县| 泌阳县|