LoaderDialog自定义加载框的实现

package com.loaderman.loadingdialogdemo;

import android.app.Dialog;
import android.content.Context;
import android.os.Handler;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * LoadingDialog.java
 */

public class LoadingDialog extends Dialog {
    private static final int  CHANGE_TITLE_WHAT        = 1;
    private static final int  CHNAGE_TITLE_DELAYMILLIS = 300;
    private static final int  MAX_SUFFIX_NUMBER        = 3;
    private static final char SUFFIX                   = '.';

    private ImageView       iv_route;
    private TextView        tv;
    private TextView        tv_point;
    private RotateAnimation mAnim;
    private boolean cancelable = true;

    private Handler handler = new Handler() {
        private int num = 0;

        public void handleMessage(android.os.Message msg) {
            if (msg.what == CHANGE_TITLE_WHAT) {
                StringBuilder builder = new StringBuilder();
                if (num >= MAX_SUFFIX_NUMBER) {
                    num = 0;
                }
                num++;
                for (int i = 0; i < num; i++) {
                    builder.append(SUFFIX);
                }
                tv_point.setText(builder.toString());
                if (isShowing()) {
                    handler.sendEmptyMessageDelayed(CHANGE_TITLE_WHAT, CHNAGE_TITLE_DELAYMILLIS);
                } else {
                    num = 0;
                }
            }
        }

        ;
    };

    public LoadingDialog(Context context) {
        super(context, R.style.Dialog_bocop);
        init();
    }

    private void init() {
        View contentView = View.inflate(getContext(), R.layout.activity_custom_loding_dialog_layout, null);
        setContentView(contentView);

        contentView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (cancelable) {
                    dismiss();
                }
            }
        });
        iv_route = (ImageView) findViewById(R.id.iv_route);
        tv = (TextView) findViewById(R.id.tv);
        tv_point = (TextView) findViewById(R.id.tv_point);
        initAnim();
        //getWindow().setWindowAnimations(R.anim.alpha_in);
    }


    private void initAnim() {
        mAnim = new RotateAnimation(360, 0, Animation.RESTART, 0.5f, Animation.RESTART, 0.5f);
        mAnim.setDuration(2000);
        mAnim.setRepeatCount(Animation.INFINITE);
        mAnim.setRepeatMode(Animation.RESTART);
        mAnim.setStartTime(Animation.START_ON_FIRST_FRAME);
    }

    @Override
    public void show() {
        iv_route.startAnimation(mAnim);
        handler.sendEmptyMessage(CHANGE_TITLE_WHAT);
        super.show();
    }

    @Override
    public void dismiss() {
        mAnim.cancel();
        super.dismiss();
    }


    @Override
    public void setCancelable(boolean flag) {
        cancelable = flag;
        super.setCancelable(flag);
    }

    @Override
    public void setTitle(CharSequence title) {
        tv.setText(title);
    }

    @Override
    public void setTitle(int titleId) {
        setTitle(getContext().getString(titleId));
    }
}
package com.loaderman.loadingdialogdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    LoadingDialog dialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_loding_dialog_main);
        dialog = new LoadingDialog(this);
    }
    public void btnClick(View v) {
        dialog.show();
    }
}

 在res/anim文件下新建alpha_in.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:duration="1000"
       android:fromAlpha="0.0"
       android:toAlpha="1.0"
    >
</alpha>

  在res/layout文件下新建activity_custom_loding_dialog_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="@android:color/white"
                android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@drawable/bt_pay_selector"
        android:onClick="btnClick"
        android:paddingLeft="10dip"
        android:paddingRight="10dip"
        android:text="show Dialog"
        android:textColor="@android:color/white"/>


</RelativeLayout>

   在res/layout文件下新建activity_custom_loding_dialog_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:gravity="center">

    <LinearLayout
        android:layout_width="220dp"
        android:layout_height="220dp"
        android:layout_gravity="center"
        android:background="@drawable/dialog_bocop_loaing_bg"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:gravity="center">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:padding="3dp"
                android:src="@mipmap/ic_launcher"/>

            <ImageView
                android:id="@+id/iv_route"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:background="@drawable/dialog_bocop_loading_rotate_anim_img"/>
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_weight="1"
            android:gravity="center_horizontal">

            <TextView
                android:id="@+id/tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toLeftOf="@+id/tv_point"
                android:ellipsize="marquee"
                android:gravity="center"
                android:singleLine="true"
                android:text="正在加载"
                android:textColor="#6F6868"
                android:textSize="20sp"
                />

            <TextView
                android:id="@+id/tv_point"
                android:layout_width="20dp"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:text="..."
                android:textColor="#6F6868"
                android:textSize="20sp"/>
        </RelativeLayout>
    </LinearLayout>

</LinearLayout>

 效果图:

原文地址:https://www.cnblogs.com/loaderman/p/6477273.html