自定义Dialog设置全屏显示和背景透明

因为公司业务需要,需要在每一个页面请求网络的时候,显示加载中的动画,当请求完毕时,需要隐藏动画,所以考虑自定义一个Dialog放在BaseActivity中,在BaseActivity中暴露出来两个方法,一个用于显示加载动画,一个用来隐藏加载动画。在这里考虑使用帧动画实现。

自定义Dialog的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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">

    <ImageView
        android:id="@+id/loadingIv"
        android:layout_width="@dimen/dp_60"
        android:layout_height="@dimen/dp_60"
        android:layout_centerInParent="true"
        android:background="@drawable/animation_loading_running" />

    <TextView
        android:id="@+id/loadingTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/loadingIv"
        android:layout_centerInParent="true"
        android:textColor="@color/white"
        android:textSize="@dimen/sp_14"
        tools:text="正在加载中..." />

</RelativeLayout>

效果图如下(动图略小。。。):


帧动画布局文件如下,其实就是7张连续的图片:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<!--网络加载中动画-->
<item
android:drawable="@mipmap/ic_loading_run01"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run02"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run03"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run04"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run05"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run06"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run07"
android:duration="150" />
</animation-list>


自定义Dialog类如下:

package cn.oneday.customloadingdialog;

import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * @Description:自定义加载框
 */
public class CustomProgressDialog extends ProgressDialog {
    private AnimationDrawable mAnimation;
    private Context mContext;
    private ImageView mImageView;
    private String mLoadingTip;
    private TextView mLoadingTv;
    private int mResid;

    public CustomProgressDialog(Context context, String content, int theme, int id) {
        super(context, theme);
        this.mContext = context;
        this.mLoadingTip = content;
        this.mResid = id;
        setCanceledOnTouchOutside(false);// 设置不能点击对话框外边取消当前对话框
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        initData();
    }

    private void initData() {
        mImageView.setBackgroundResource(mResid);
        // 通过ImageView对象拿到背景显示的AnimationDrawable  
        mAnimation = (AnimationDrawable) mImageView.getBackground();
        // 为了防止在onCreate方法中只显示第一帧的解决方案之一  
        mImageView.post(new Runnable() {
            @Override
            public void run() {
                mAnimation.start();

            }
        });
        mLoadingTv.setText(mLoadingTip);
    }

    public void setContent(String str) {
        mLoadingTv.setText(str);
    }

    private void initView() {
        setContentView(R.layout.progress_loading_dialog);
        mLoadingTv = (TextView) findViewById(R.id.loadingTv);
        mImageView = (ImageView) findViewById(R.id.loadingIv);
    }
}  


因为自定义的Dialog默认在布局文件中设置的宽高是没有效果的,所以需要在代码中动态的设置Dialog的宽和高。
在Activity中使用:

package cn.oneday.customloadingdialog;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Display;
import android.view.WindowManager;

public class MainActivity extends AppCompatActivity {
    private CustomProgressDialog customProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        customProgressDialog = new CustomProgressDialog(this, "拼命加载中...", R.style.Dialog_Fullscreen, R.drawable.animation_loading_running);
        // customProgressDialog.setCancelable(false); // 设置不响应返回按钮点击事件
        customProgressDialog.show();

        // 动态设置自定义Dialog的显示内容的宽和高
        WindowManager m = getWindowManager();
        Display d = m.getDefaultDisplay();  //为获取屏幕宽、高
        android.view.WindowManager.LayoutParams p = customProgressDialog.getWindow().getAttributes();  //获取对话框当前的参数值
        p.height = (int) (d.getHeight() * 0.3);   //高度设置为屏幕的0.3
        p.width = d.getWidth();    //宽度设置为全屏
        customProgressDialog.getWindow().setAttributes(p);     //设置生效
    }
}


自定义对话框样式,在布局文件中设置没有效果,需要在创建对话框对象时指定才能生效:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--加载进度对话框样式-->
    <style name="Dialog_Fullscreen">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
        <item name="android:windowIsTranslucent">false</item><!--半透明-->
        <item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
        <item name="android:backgroundDimEnabled">true</item><!--模糊-->
    </style>
</resources>


以此记录,方便以后查阅,如有错误,请指正,万分感谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值