自定义LoadingDialog

本文介绍了如何自定义一个LoadingDialog,包括继承Dialog,创建主题样式文件,设计布局文件以及运用动画效果。通过这些步骤,可以实现具有个性化特色的加载对话框。

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

 1.继承dialog
 2.一个主题样式文件
 3.一个布局文件来加载
 4.一个anim文件

1.自定义Dialog

public class MyDialog extends Dialog {

    ImageView imageView;
    AnimationDrawable anim;
    Context context;
    public MyDialog(Context context,int style) {
        super(context, style);//设置样式
        this.context = context;
        View view = LayoutInflater.from(context).inflate(
                R.layout.dt_now_page_loading, null);
         imageView = (ImageView) view.findViewById(R.id.loding_img);
        anim = (AnimationDrawable) context.getResources().getDrawable(R.drawable.loading_drawable);
        imageView.setImageDrawable(anim);
        setCancelable(true);
        setCanceledOnTouchOutside(true);
//      dialog.setCancelable(false);   dialog弹出后会点击屏幕或物理返回键,dialog不消失
//      dialog.setCanceledOnTouchOutside(false);   dialog弹出后会点击屏幕,dialog不消失;点击物理返回键dialog消失
//
        setAttributes();
        setContentView(view);//加载view到dialog上
    }
    public void setAttributes(){
        WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
        layoutParams.width = dp2px(context,60);
        layoutParams.height = dp2px(context,60);
//        layoutParams.alpha = 1;//alpha在0.0f到1.0f之间。1.0完全不透明,0.0f完全透明,自身不可见  (dialog自身的透明度)
//        layoutParams.dimAmount = 0;//dialog所在窗体的背景  dimAmount在0.0f和1.0f之间,0.0f完全不暗,即背景是可见的 ,1.0f时候,背景全部变黑暗
        getWindow().setWindowAnimations(R.style.Show_Dismiss_dialog);//设置dialog所在窗体的动画(即show和dismiss的动画效果)
    }

    public void startAnimation() {
        if (!anim.isRunning()) {
            anim.start();
        }
    }
    public void stopAnimation(){
        if(anim.isRunning()){
            anim.stop();
        }
    }
    public static int dp2px(Context context, int dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}

2.使用Dialog

public class MainActivity extends AppCompatActivity {
    MyDialog myDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDialog = new MyDialog(this,R.style.DT_DIALOG_Translucent);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog();
            }
        });
    }
    private void showDialog(){
        if(myDialog!=null) {
            myDialog.startAnimation();
            if (myDialog.isShowing()) {
                return;
            }
            if (!isFinishing()) {
                myDialog.show();
            }
        }
    }
    private void closeDialog(){
        if(myDialog!=null) {
            myDialog.stopAnimation();
            if (!myDialog.isShowing()) {
                return;
            }
            if (!isFinishing()) {
                myDialog.dismiss();
            }
        }
    }
}

3.样式
dialog样式和dialog窗体动画
<!--dialog的样式-->
    <style name="DT_DIALOG_Translucent" parent="android:style/Theme.Dialog">
        <item name="android:windowIsFloating">false</item><!--是否浮在activity上-->
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFrame">@null</item><!--是否有边框-->
        <item name="android:background">#00000000</item><!--背景透明-->
        <item name="android:windowBackground">@android:color/transparent</item><!--窗体背景透明-->
    </style>
<!--dialog所在窗体的显示隐藏动画-->
    <style name="Show_Dismiss_dialog" parent="android:Animation">
        <item name="android:windowEnterAnimation">@anim/dt_dialog_enter_anim</item>
        <item name="android:windowExitAnimation">@anim/dt_dialog_exit_anim</item>
    </style>
</resources>

图片动画 和窗体动画的具体实现
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"  >
    <!-- 定义一个动画帧,Drawable为img0,持续时间20毫秒 -->
<item android:drawable="@mipmap/loading_pic_01" android:duration="50" />
<item android:drawable="@mipmap/loading_pic_02" android:duration="50" />
<item android:drawable="@mipmap/loading_pic_03" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_04" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_05" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_06" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_07" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_08" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_09" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_10" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_11" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_12" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_13" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_14" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_15" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_16" android:duration="100" />
<item android:drawable="@mipmap/loading_pic_17" android:duration="50" />
<item android:drawable="@mipmap/loading_pic_18" android:duration="50" />
<item android:drawable="@mipmap/loading_pic_19" android:duration="50" />
</animation-list>

<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale  android:interpolator="@android:anim/accelerate_decelerate_interpolator"
          android:fromXScale="0.0"
          android:toXScale="1.0"
          android:fromYScale="0.0"
          android:toYScale="1.0"
          android:pivotX="50%"
          android:pivotY="50%"
          android:fillAfter="false"
          android:duration="234" >
 </scale>
 <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="234" />
</set>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值