自定义ProgressDialog
2015-12-14 16:13
459 查看
制作一个自定义的ProgressDialog大概可以分为以下几个步骤。
1:创建一个先的Class 继承自ProgressDialog
public MyProgressDialog(Context context) {
this(context, R.style.progressDialog);
}
其中theme参数是你所设定的ProgressDialog的属性 具体值如下:
<style name="progressDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<!-- 边框 -->
<item name="android:windowIsFloating">true</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 半透明 -->
<item name="android:windowNoTitle">true</item>
<!-- 无标题 -->
<item name="android:windowBackground">@color/transparent</item>
<!-- 背景透明 -->
<item name="android:backgroundDimEnabled">false</item>
<!-- 模糊 -->
</style>
如上属性中,backgroundDimEnabled 属性如果设为true 真个页面在展示你自己的ProgressDialog的同时也会显示一个浅灰色的半透明背景
2:创建自定义ProgressDialog的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="96dp"
android:layout_height="90dp"
android:layout_centerInParent="true"
android:background="@drawable/progress_dialog_bg"
android:orientation="vertical">
<RelativeLayout
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<ImageView
android:id="@+id/progress_img"
android:layout_width="46dp"
android:layout_height="46dp"
android:adjustViewBounds="true"
android:layout_centerInParent="true"
android:src="@mipmap/loading_cir"/>
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@mipmap/ic_android_white_24dp"
android:layout_centerInParent="true"/>
</RelativeLayout>
<TextView
android:paddingTop="3dp"
android:id="@+id/progress_msg"
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12dp"
android:textColor="@color/white"
android:layout_gravity="center_horizontal"
android:text="加载中……"/>
</LinearLayout>
</RelativeLayout>
效果图,大致如下所示:
3:在自定义的ProgressDialog中完成各种回调和设置
在onCreate中设置ContentView,就是刚才写的布局,之后将Dialog的window属性设置为MATCH_PARENT,cancelable设置为false
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progress_dialog_layout);
WindowManager.LayoutParams params=this.getWindow().getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
this.getWindow().setAttributes(params);
progress_img= (ImageView) findViewById(R.id.progress_img);
this.setCancelable(false);
this.setIndeterminate(true);
}
定义显示函数,其中使用了ObjectAnimator 可以使用其他动画代替。
public void showProgressDialog(){
this.show();
progress_rotate = ObjectAnimator.ofFloat(progress_img,"rotation",360f,0f);
progress_rotate.setRepeatMode(ValueAnimator.RESTART);
progress_rotate.setRepeatCount(-1);
progress_rotate.setDuration(2000);
progress_rotate.setInterpolator(new LinearInterpolator());
progress_rotate.start();
}
定义隐藏函数,记得关闭动画
public void hideProgressDialog(){
if (progress_rotate !=null)
progress_rotate.cancel();
this.cancel();
}
在很多时候Dialog设置了cancelable,点击空白和back键都无法隐藏Dialog,在此处可以重写OnBackPressed方法实现 点击空白不取消,点击Back取消的效果
@Override
public void onBackPressed() {
hideProgressDialog();
}
这样在别的地反创建自己定义的ProgressDialog就可以显示自定义的ProgressDialog了。
注意:因为dialog是带有主题参数的,所以在创建Dialog用到的Context对象,需要时Activity的,不可以使用Application的。
1:创建一个先的Class 继承自ProgressDialog
public MyProgressDialog(Context context) {
this(context, R.style.progressDialog);
}
其中theme参数是你所设定的ProgressDialog的属性 具体值如下:
<style name="progressDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<!-- 边框 -->
<item name="android:windowIsFloating">true</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 半透明 -->
<item name="android:windowNoTitle">true</item>
<!-- 无标题 -->
<item name="android:windowBackground">@color/transparent</item>
<!-- 背景透明 -->
<item name="android:backgroundDimEnabled">false</item>
<!-- 模糊 -->
</style>
如上属性中,backgroundDimEnabled 属性如果设为true 真个页面在展示你自己的ProgressDialog的同时也会显示一个浅灰色的半透明背景
2:创建自定义ProgressDialog的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="96dp"
android:layout_height="90dp"
android:layout_centerInParent="true"
android:background="@drawable/progress_dialog_bg"
android:orientation="vertical">
<RelativeLayout
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<ImageView
android:id="@+id/progress_img"
android:layout_width="46dp"
android:layout_height="46dp"
android:adjustViewBounds="true"
android:layout_centerInParent="true"
android:src="@mipmap/loading_cir"/>
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@mipmap/ic_android_white_24dp"
android:layout_centerInParent="true"/>
</RelativeLayout>
<TextView
android:paddingTop="3dp"
android:id="@+id/progress_msg"
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12dp"
android:textColor="@color/white"
android:layout_gravity="center_horizontal"
android:text="加载中……"/>
</LinearLayout>
</RelativeLayout>
效果图,大致如下所示:
3:在自定义的ProgressDialog中完成各种回调和设置
在onCreate中设置ContentView,就是刚才写的布局,之后将Dialog的window属性设置为MATCH_PARENT,cancelable设置为false
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progress_dialog_layout);
WindowManager.LayoutParams params=this.getWindow().getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
this.getWindow().setAttributes(params);
progress_img= (ImageView) findViewById(R.id.progress_img);
this.setCancelable(false);
this.setIndeterminate(true);
}
定义显示函数,其中使用了ObjectAnimator 可以使用其他动画代替。
public void showProgressDialog(){
this.show();
progress_rotate = ObjectAnimator.ofFloat(progress_img,"rotation",360f,0f);
progress_rotate.setRepeatMode(ValueAnimator.RESTART);
progress_rotate.setRepeatCount(-1);
progress_rotate.setDuration(2000);
progress_rotate.setInterpolator(new LinearInterpolator());
progress_rotate.start();
}
定义隐藏函数,记得关闭动画
public void hideProgressDialog(){
if (progress_rotate !=null)
progress_rotate.cancel();
this.cancel();
}
在很多时候Dialog设置了cancelable,点击空白和back键都无法隐藏Dialog,在此处可以重写OnBackPressed方法实现 点击空白不取消,点击Back取消的效果
@Override
public void onBackPressed() {
hideProgressDialog();
}
这样在别的地反创建自己定义的ProgressDialog就可以显示自定义的ProgressDialog了。
注意:因为dialog是带有主题参数的,所以在创建Dialog用到的Context对象,需要时Activity的,不可以使用Application的。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories