Android建立自定義dialog方法詳解-樣式去掉陰影效果
在自定義元件時,從已有元件原始碼中會很大收穫。
就拿progressDialog來說
間接父類是dialog,想了解dialog繼承結構可以去百度,或者
從構造器來說ProgressDialog(Context context, int theme)很明顯需要個樣式主題檔案,我們可以在value檔案下自定義一個樣式檔案。
從外觀上需要個動態效果控制元件和文字框兩個屬性
ProgressBar mProgress; TextView mMessageView
原始碼中onCreate()方法中 有
View view = inflater.inflate(R.layout.alert_dialog_progress, null);
setView(view);
動態效果是由ProgressBar實現,當然我們可以通過給圖片新增動態效果也可以實現類似功能,這就需要個anim檔案
從上可以總結出建立自定義dialog需要的步驟
1.繼承dialog
2.一個主題樣式檔案
3.一個佈局檔案來載入
4.一個anim檔案
程式碼:public class IphoneProgersssDialog extends Dialog {
private Context context;
private ImageView img;
private TextView txt;
public IphoneProgersssDialog(Context context) {
super(context, R.style.iphone_progress_dialog
this.context=context;
//載入佈局檔案
LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view=inflater.inflate(R.layout.iphone_progress_dialog, null);
img=(ImageView) view.findViewById(R.id.iphone_progress_dialog_img);
txt=(TextView) view.findViewById(R.id.iphone_progress_dialog_txt);
//給圖片新增動態效果
Animation anim=AnimationUtils.loadAnimation(context, R.anim.progressbar);
img.setAnimation(anim);
txt.setText(R.string.iphone_progressbar_dialog_txt);
//dialog新增檢視
setContentView(view);
}
public void setMsg(String msg){
txt.setText(msg);
}
public void setMsg(int msgId){
txt.setText(msgId);
}
}
看了下pregeressdialog中像activity類一樣都有生命週期函式,其實dialog和activity都是窗體概念,並不是api中window類,有個地方還是不明白,希望哪位以後版主有針對setcontentview 和setview的話題。
現在我們就做個iphone風格的進度條吧!
1.繼承
public class IphoneProgersssDialog extends Dialog
2.定義主題樣式
在value資原始檔下
<style name="iphone_progress_dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框為無 -->
<item name="android:windowIsFloating">true</item><!-- 是否漂現在activity上-->
<item name="android:windowIsTranslucent">true</item><!-- 是否半透明 -->
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">false</item><!--
dim:模糊的 陰影效果 -->
<item name="android:windowBackground">@drawable/load_bg</item><!--
背景圖片的大小也影響視窗的大小 -->
</style>
在構造器中 super(context, R.style.iphone_progress_dialog);
3.定義動畫檔案 progressbar.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >
<rotate
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:fromDegrees="0"
android:toDegrees="+360"
android:duration="1000"
android:startOffset="-1"
android:repeatMode="restart"
android:repeatCount="-1"/>
</set>
給圖片載入動畫
Animation anim=AnimationUtils.loadAnimation(context, R.anim.progressbar);
img.setAnimation(anim);
最後就是setContentview;沒有去分析setView的區別
圖片不曉得我只上傳不了,也許是瀏覽器的原因吧。
使用方法:
new IphoneProgersssDialog ().show();