效果圖
使用說(shuō)明
1、項(xiàng)目下的build.gradle添加
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
2、模塊下的build.gradle添加依賴(lài)
dependencies {
compile 'com.github.gittjy:LoadingDialog:1.0.2'
}
3、在代碼中使用
LoadingDailog.Builder loadBuilder=new LoadingDailog.Builder(this)
.setMessage("加載中...")
.setCancelable(true)
.setCancelOutside(true);
LoadingDailog dialog=loadBuilder.create();
dialog.show();
實(shí)現(xiàn)過(guò)程
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog_loading_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="150dp"
android:layout_height="110dp"
android:background="@drawable/loading_bg"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="10dp"
android:paddingLeft="21dp"
android:paddingRight="21dp"
android:paddingTop="10dp">
<ProgressBar
android:id="@+id/progressBar1"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center_horizontal"
android:indeterminateBehavior="repeat"
android:indeterminateDrawable="@drawable/dialog_loading"
android:indeterminateOnly="true" />
<TextView
android:id="@+id/tipTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="加載中..."
android:textColor="#f0f0f0"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
布局文件挺簡(jiǎn)單的髓废,不過(guò)說(shuō)實(shí)在的,我對(duì)布局有些東西掌握并不好该抒,有的只知道這樣可以去達(dá)到想要實(shí)現(xiàn)的效果慌洪,但是不知道為什么.....
簡(jiǎn)單說(shuō)說(shuō)這個(gè),最外面是一個(gè)LinearLayout凑保,給他設(shè)置了一個(gè).9.png的背景圖作為整個(gè)彈窗的背景冈爹,然后在上面用一個(gè)progressbar來(lái)顯示一個(gè)圈兒轉(zhuǎn)起來(lái)的動(dòng)畫(huà)效果,下面的textview用來(lái)設(shè)置提示信息
在progressbar中有幾個(gè)不常用到的屬性說(shuō)一下:
indeterminateBehavior欧引,indeterminateDrawable频伤,indeterminateOnly
這三個(gè)都是用來(lái)設(shè)置progressbar顯示的進(jìn)度模式為模糊的模式,即不顯示具體的進(jìn)度數(shù)值维咸,說(shuō)通俗點(diǎn)兒就是沒(méi)有百分比啥的效果,只有一個(gè)不明物體在那兒轉(zhuǎn)得飛起惠爽,其中indeterminateDrawable指定了一個(gè)旋轉(zhuǎn)的資源文件癌蓖,資源文件定義了一個(gè)動(dòng)畫(huà)效果,具體代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@mipmap/dialog_loading_img"
android:pivotX="50%"
android:pivotY="50%" />
資源文件中設(shè)置的圖片資源就是這個(gè)
然后指定了旋轉(zhuǎn)中心為圖片中心點(diǎn)
到這婚肆,布局文件基本上就準(zhǔn)備好了...
自定義Dialog
接下來(lái)的工作就是自定義一個(gè)LoadingDialog類(lèi)繼承Dialog租副,把寫(xiě)好的布局文件加載出來(lái),同時(shí)提供一些自定義屬性
直接上代碼:
package com.android.tu.loadingdialog;
import android.app.Dialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
/**
* Created by tjy on 2017/6/19.
*/
public class LoadingDialog extends Dialog{
public LoadingDialog(Context context) {
super(context);
}
public LoadingDialog(Context context, int themeResId) {
super(context, themeResId);
}
public static class Builder{
private Context context;
private String message;
private boolean isShowMessage=true;
private boolean isCancelable=false;
private boolean isCancelOutside=false;
public Builder(Context context) {
this.context = context;
}
/**
* 設(shè)置提示信息
* @param message
* @return
*/
public Builder setMessage(String message){
this.message=message;
return this;
}
/**
* 設(shè)置是否顯示提示信息
* @param isShowMessage
* @return
*/
public Builder setShowMessage(boolean isShowMessage){
this.isShowMessage=isShowMessage;
return this;
}
/**
* 設(shè)置是否可以按返回鍵取消
* @param isCancelable
* @return
*/
public Builder setCancelable(boolean isCancelable){
this.isCancelable=isCancelable;
return this;
}
/**
* 設(shè)置是否可以取消
* @param isCancelOutside
* @return
*/
public Builder setCancelOutside(boolean isCancelOutside){
this.isCancelOutside=isCancelOutside;
return this;
}
public LoadingDialog create(){
LayoutInflater inflater = LayoutInflater.from(context);
View view=inflater.inflate(R.layout.dialog_loading,null);
LoadingDialog loadingDailog=new LoadingDialog(context,R.style.MyDialogStyle);
TextView msgText= (TextView) view.findViewById(R.id.tipTextView);
if(isShowMessage){
msgText.setText(message);
}else{
msgText.setVisibility(View.GONE);
}
loadingDailog.setContentView(view);
loadingDailog.setCancelable(isCancelable);
loadingDailog.setCanceledOnTouchOutside(isCancelOutside);
return loadingDailog;
}
}
}
在這里较性,沒(méi)有直接在構(gòu)造函數(shù)中設(shè)置各種屬性用僧,加載布局什么的,而是采用了Builder的模式赞咙,至于為什么采用這個(gè)模式责循,因?yàn)锳ndroid自己的AlertDialog就是采用的這種模式啊,哈哈哈攀操,是不是感覺(jué)很有道理院仿。另外,推薦一篇文章速和,寫(xiě)的很通俗歹垫,看了就知道Builder模式的好處了,賣(mài)熱干面的啟發(fā) ---Builder 模式
簡(jiǎn)單解釋一下上面的代碼颠放,我在LoadingDialog的內(nèi)部又定義了一個(gè)內(nèi)部類(lèi)Builder排惨,Bulder類(lèi)內(nèi)部提供了各個(gè)可能需要自定義的屬性,包括設(shè)置提示信息碰凶,設(shè)置是否可以取消等暮芭,但其實(shí)在我們使用AlertDialog的時(shí)候就知道鹿驼,我們并不是需要去設(shè)置所有屬性,很多都只需要保持默認(rèn)值谴麦,這時(shí)候Builder的模式的好處就出來(lái)了蠢沿,每個(gè)屬性都會(huì)返回類(lèi)型都是Builder,使用者可以在后面自由的連續(xù).set所需要的屬性匾效,想起什么設(shè)置什么就好了舷蟀,不需要關(guān)心順序、個(gè)數(shù)的多少面哼,最終都會(huì)返回Builder類(lèi)型的對(duì)象野宜;
最后在Builder類(lèi)中又定義了一個(gè)create方法,這個(gè)方法也是和Android自己的AlertDialog中的create方法一樣魔策,它將返回一個(gè)Dialog對(duì)象匈子,也就是說(shuō)在這個(gè)方法中,我們需要做的就是根據(jù)各種屬性和布局文件闯袒,創(chuàng)建一個(gè)Dialog對(duì)象并返回虎敦。這里面就是一些自定義Dialog的常規(guī)代碼,就不詳細(xì)解釋了...
到這政敢,自定義的一個(gè)Dialog就已經(jīng)做好了...寫(xiě)完了發(fā)現(xiàn)真的沒(méi)有什么技術(shù)含量...不過(guò)熟悉熟悉這個(gè)過(guò)程和Builder模式也還是挺好的...
完整代碼和資源文件可以在github上下載
github
2017.6.22 23:24
806實(shí)驗(yàn)室