android 加載數據或提交數據時顯示轉圈的提示頁面android
提早聲明一下,本博客全是本身的理解,若是內容中有理解錯誤的地方,歡迎指正。另外,博客內容有參考其餘博客,本博客只用來學習。ide
當咱們進入到一個頁面時,一般先會出現一個轉圈的dialog,這是由於這個頁面須要加載數據,爲了防止數據加載完成前空白的頁面,一般會先顯示轉圈的dialog,直到數據加載完成,圈消失。那麼,這個轉圈的dialog是怎麼實現的呢?函數
首先,先寫 顯示轉圈的layout:progress_hud.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/progress_hud_bg"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingBottom="20dp"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:paddingTop="20dp" >
<ImageView
android:id="@+id/spinnerImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/spinner" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="Message"
android:textColor="#FFFFFF" />
</LinearLayout>學習
圖片的背景是動畫spinner,具體實現以下:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item
android:drawable="@drawable/spinner_0"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_1"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_2"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_3"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_4"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_5"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_6"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_7"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_8"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_9"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_10"
android:duration="60"/>
<item
android:drawable="@drawable/spinner_11"
android:duration="60"/>
</animation-list>
這裏提一下安卓的動畫。android支持3種動畫模式,tween animation,frame animation和property animation,這三種動畫模式在SDK中被稱爲view animation,drawable animation和property animation。
tween animation(view animation):補間動畫。
frame animation(view animation):逐幀動畫。
property animation:屬性動畫,這個是在Android 3.0中才引進的。
這裏咱們只介紹一下用到的逐幀動畫。就像GIF圖片,經過設置一系列圖片(Drawable)依次顯示來模擬動畫的效果。必須以<animation-list>爲根元素,以<item>表示要輪換顯示的圖片,duration屬性表示各項顯示的時間。上面的xml文件中:android:oneshot若是爲true,則動畫只播放一遍,false,則一直播放,直到設置它中止。android:duration爲每張圖片播放時間。
接下來就是咱們的ProgressHUD類。
1. 首先是兩個構造函數:
<span style="white-space:pre"> </span>public ProgressHUD(Context context) {
super(context);
}
public ProgressHUD(Context context, int theme) {
super(context, theme);
}
int theme:設置progressHUD的style,一下子講。
2. 而後是onWindowFocusChanged方法。
<span style="white-space:pre"> </span>public void onWindowFocusChanged(boolean hasFocus){
ImageView imageView = (ImageView) findViewById(R.id.spinnerImageView);
<span style="white-space:pre"> </span>AnimationDrawable spinner = (AnimationDrawable) imageView.getBackground();
<span style="white-space:pre"> </span>spinner.start();
onWindowFocusChanged()方法是在和用戶交互時調用的,activity獲取到焦點或者失去焦點時都會調用,它在activity的生命週期中是這樣的:
進入時:onStart---->onResume---->onWindowFocusChanged(true)
退出時:onPause---->onStop---->onWindowFocusChanged(false)
可見,只有在用戶真正獲取到屏幕焦點後會調用。因此,在onWindowFocusChanged方法中去啓動動畫spinner。
3. setMessage方法用來設置 轉圈時,顯示的文字,如「正在加載數據。。。」等。
<span style="white-space:pre"> </span>public void setMessage(CharSequence message) {
if(message != null && message.length() > 0) {
findViewById(R.id.message).setVisibility(View.VISIBLE);
TextView txt = (TextView)findViewById(R.id.message);
txt.setText(message);
txt.invalidate();
}
invalidate()方法的做用時請求重繪view樹。事實上,在setVisibility()由可見變爲不可見或者由不可見變爲可見狀態時,會自動調用invalidate()方法,我也不知道爲何此處又調用一次,我試了一下林註釋掉這行代碼,也徹底能夠正常運行。
4. 最後是 show()方法。
<span style="white-space:pre"> </span>public static ProgressHUD show(Context context, CharSequence message, boolean indeterminate, boolean cancelable,
OnCancelListener cancelListener) {
ProgressHUD dialog = new ProgressHUD(context,R.style.ProgressHUD);
dialog.setTitle("");
dialog.setContentView(R.layout.progress_hud);
if(message == null || message.length() == 0) {
dialog.findViewById(R.id.message).setVisibility(View.GONE);
} else {
TextView txt = (TextView)dialog.findViewById(R.id.message);
txt.setText(message);
}
dialog.setCancelable(cancelable);
dialog.setOnCancelListener(cancelListener);
dialog.getWindow().getAttributes().gravity=Gravity.CENTER;//設置dialog顯示在屏幕中央
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.dimAmount=0.2f; //設置控件的黑暗度,值爲0-1。0.0f徹底不暗,1.0f徹底黑暗。也能夠設置控件的透明度,如:<span style="color: rgb(73, 73, 73); font-family: simsun; font-size: 16px; line-height: 24px; background-color: rgb(230, 232, 231);">lp.alpha=1.0f;</span>
dialog.getWindow().setAttributes(lp);
//dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
dialog.show();
return dialog;
}
ProgressHUD類已完畢,咱們再說一下R.style.ProgressHUD。
styles.xml:
<style name="ProgressHUD" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
</style>
大體說一下。windowFrame:Dialog的windowFrame框爲無
windowIsFloating:是否浮如今activity之上
windowContentOverlay:設置窗體內容背景
windowAnimationStyle:設置動畫
windowSoftInputMode:
活動的主窗口如何與包含屏幕上的軟鍵盤窗口交互。這個屬性的設置將會影響兩件事情:動畫
1> 軟鍵盤的狀態——是否它是隱藏或顯示——當活動(Activity)成爲用戶關注的焦點。this
2> 活動的主窗口調整——否減小活動主窗口大小以便騰出空間放軟鍵盤或是否當活動窗口的部分被軟鍵盤覆蓋時它的內容的當前焦點是可見的。spa
"stateUnspecified" 軟鍵盤的狀態(是否它是隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。這個是爲了軟件盤行爲默認的設置。
"adjustPan" 該Activity主窗口並不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能老是看到輸入內容的部分。這個一般是不指望比調整大小,由於用戶可能關閉軟鍵盤以便得到與被覆蓋內容的交互操做。
windowBackground:設置dialog的背景
windowNoTitle:是否顯示title.net
至此,自定義的progressdialog實現已經完成,最後就是調用它的activity了,以下:
public class MainActivity extends ActionBarActivity {
private Context context;
public ProgressHUD mProgressHUD;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
}
public void loadDataStyle1(View view){
showMyDialog(true);
}
public void showMyDialog( boolean isCancelable) {
mProgressHUD = ProgressHUD.show(context, "加載中", true, isCancelable, null);}
activity_main.xm:
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.loaddatastyle.MainActivity" >
<Button
android:id="@+id/style1Btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="45dp"
android:onClick="loadDataStyle1"
android:text="點擊按鈕,開始加載數據" />
</RelativeLayout>
源代碼地址:http://download.csdn.net/detail/u010127250/9023275xml
————————————————
版權聲明:本文爲CSDN博主「imutlxy」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/u010127250/article/details/47776789blog