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

来源:互联网 发布:淘宝我的空间 编辑:程序博客网 时间:2024/05/16 15:24

因为公司业务需要,需要在每一个页面请求网络的时候,显示加载中的动画,当请求完毕时,需要隐藏动画,所以考虑自定义一个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>


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

2 0