Android "加载中..." 动态效果实现

7,053 阅读2分钟

之前在技术问答上面看到一个提问 “加载中…” 后面三个点是动态的,这么一个效果实现。想来想去,好像没想到好的处理方式。
尝试了一下,以一个最笨的方式实现了。先来看一下效果 :

我是通过自定义一个Dialog,加载中的效果,是在Dialog内部实现的,进度还是从Activity里面控制的。
下面是Dialog实现类:

public class CustomDialog extends AlertDialog {
    public CustomDialog(Context context) {
        super(context);
    }

    private TextView tv_loading;
    private ProgressBar progressBar;

    private Timer timer;
    private int count = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_progress);
        tv_loading = (TextView) findViewById(R.id.tv_loading);
        progressBar = (ProgressBar) findViewById(R.id.pb);

        
        Display d = getWindow().getWindowManager().getDefaultDisplay();
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        
        lp.width = (int) (d.getWidth() * 0.8);
        getWindow().setAttributes(lp);

        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0);
            }
        }, 300, 300);
        setOnDismissListener(new OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                if (timer != null) {
                    timer.cancel();
                }
            }
        });
    }

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            count++;
            if (count > 3) {
                count = 1;
            }
            switch (count) {
                case 1:
                    tv_loading.setText("加载中.");
                    break;
                case 2:
                    tv_loading.setText("加载中..");
                    break;
                case 3:
                    tv_loading.setText("加载中...");
                    break;
            }
        }
    };

    public void setProgress(int progress) {
        progressBar.setProgress(progress);
        if (progress == 100) {
            this.dismiss();
        }
    }

}

布局文件就一个TextView,一个ProgressBar,
dialog_progress.xml




    

    



因为没想到其他的思路,所以,只能通过Timer 来计时改变TextView的显示。。(这里也希望各位大神能指点一下,目前确实想不到其他思路)
ProgressBar的样式,上一篇Android 自定义水平进度条的圆角进度里面有详细介绍,这里就不重复了。
Dialog就是这样。然后就是调用了:
MainActivity.class

public class MainActivity extends FragmentActivity {


    private CustomDialog customDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        customDialog = new CustomDialog(this);

    }

    private int count = 0;

    public void tvClick(View view) {
        customDialog.show();
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                count += 10;
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (customDialog != null && customDialog.isShowing()) {
                            customDialog.setProgress(count);
                        }
                    }
                });
                if (count >= 100) {
                    timer.cancel();
                }
            }
        }, 0, 500);
        customDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                if (timer != null) timer.cancel();
                count = 0;
            }
        });

    }

}

这里也是用的Timer来模拟加载进度,(写的过程中感觉Timer的定时操作比其他两种方式用起来方便多了)。
点击事件我是通过在xml里面直接调用的。

clickable属性不加上的话,有些手机系统默认是没法调用的(之前遇到过小米的,不加这个属性,不触发click事件)
另外,这种click事件的写法在Fragment是不可用的,只能通过setOnClickListener来触发。

代码不多,作为随手笔记。

Demo下载