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

首頁 > 系統(tǒng) > Android > 正文

Android自定義Dialog實現(xiàn)加載對話框效果

2019-10-22 18:11:29
字體:
供稿:網(wǎng)友

前言

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

android,加載,對話框,自定義,dialogandroid,加載,對話框,自定義,dialog

代碼實現(xiàn)

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,覆蓋構(gòu)造方法

public class LoadingDialog extends Dialog {  private static final String TAG = "LoadingDialog";  private String mMessage; // 加載中文字  private int mImageId; // 旋轉(zhuǎn)圖片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);  // 設(shè)置窗口大小  WindowManager windowManager = getWindow().getWindowManager();  int screenWidth = windowManager.getDefaultDisplay().getWidth();  WindowManager.LayoutParams attributes = getWindow().getAttributes();  // 設(shè)置窗口背景透明度  attributes.alpha = 0.3f;  // 設(shè)置窗口寬高為屏幕的三分之一(為了更好地適配,請別直接寫死)  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);  // 設(shè)置選擇動畫  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);}

以上代碼需要注意設(shè)置動畫旋轉(zhuǎn)中心坐標(biāo)為我們imageView的中心點,需要先對imageView進行測量,同時初始化布局的操作請放在onCreate()方法中(別直接在構(gòu)造方法中初始化布局,這樣可以在Dialog要顯示的時候才初始化,即調(diào)用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在顯示的時候就會無限重復(fù)(setRepeatCount(-1))執(zhí)行旋轉(zhuǎn)動畫,因此在Dialog消失的時候我們要取消動畫,而屏蔽返回鍵則是為了更好地讓窗口的關(guān)閉被我們的mCancelable控制。

看到這里你或許想知道我們設(shè)置的布局背景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>

你可以自己設(shè)置你想要的圓角大小,也可以設(shè)置背景顏色(會被透明處理,根據(jù)我們?yōu)榇翱谠O(shè)置的透明度)。

當(dāng)然,仔細的你會發(fā)現(xiàn)我們還少了一些必要的配置,那就是窗口的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:設(shè)置窗口的背景,這里設(shè)為透明;
•android:backgroundDimEnabled:設(shè)置窗口是否變暗(true變暗,false不變暗,見效果圖1和2)。

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

總結(jié)

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


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙陵县| 巴塘县| 肃宁县| 蕉岭县| 正定县| 唐海县| 垣曲县| 利津县| 鄂州市| 雅安市| 陇川县| 炉霍县| 汉中市| 封开县| 东港市| 股票| 韩城市| 友谊县| 华宁县| 吉木萨尔县| 永德县| 永兴县| 宜丰县| 榆林市| 扶余县| 道孚县| 四川省| 宁强县| 扶绥县| 涪陵区| 仙桃市| 修武县| 肥乡县| 湖北省| 三亚市| 东光县| 绥化市| 绥宁县| 宜州市| 自贡市| 广元市|