自定义ProgressDialog

本文详细介绍了如何实现一个自定义的ProgressDialog,包括创建自定义类、设置样式、布局设计、回调和设置等关键步骤,并展示了如何在代码中调用以实现自定义进度对话框的显示与隐藏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

制作一个自定义的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>


效果图,大致如下所示:


show

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的。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值