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

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

自定义Dialog的布局文件:




    

    


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


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


android:oneshot="false">

android:drawable="@mipmap/ic_loading_run01"
android:duration="150" />
android:drawable="@mipmap/ic_loading_run02"
android:duration="150" />
android:drawable="@mipmap/ic_loading_run03"
android:duration="150" />
android:drawable="@mipmap/ic_loading_run04"
android:duration="150" />
android:drawable="@mipmap/ic_loading_run05"
android:duration="150" />
android:drawable="@mipmap/ic_loading_run06"
android:duration="150" />
android:drawable="@mipmap/ic_loading_run07"
android:duration="150" />


自定义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);     //设置生效
    }
}


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



    
    


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

你可能感兴趣的:(Android)