热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android自定义Dialog实现文字动态加载效果

这篇文章主要为大家详细介绍了Android自定义Dialog实现文字动态加载效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

我是通过自定义一个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);

  // 设置Dialog显示的宽度,
  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

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 

 




因为没想到其他的思路,所以,只能通过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来触发。

更新一种实现方式:
感谢 IT-hero ,又 get 一个 属性动画的用法。
下面是 自定义Dialog 里的一些调整 :

private String[] scoreText = {". ", ".. ", "..."};
ValueAnimator valueAnimator;

@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);

  // 设置Dialog显示的宽度,
  Display d = getWindow().getWindowManager().getDefaultDisplay();
  WindowManager.LayoutParams lp = getWindow().getAttributes();
  //这里设置为屏幕宽度的百分之八十
  lp.width = (int) (d.getWidth() * 0.8);
  getWindow().setAttributes(lp);

  if (valueAnimator == null) {
   valueAnimator = ValueAnimator.ofInt(0, 3).setDuration(1000);
   valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
   valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
     int i = (int) animation.getAnimatedValue();
     tv_loading.setText("加载中" + scoreText[i % scoreText.length]);
    }
   });
  }
  valueAnimator.start();
}
//代码省略...

因为没找到 CSDN编辑上传资源 的方式,所以这里 Demo 里面就没有添加这个属性动画的代码,有需要的朋友可以直接从这里copy。

点击下载:源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 在Notepad++中配置Markdown语法高亮及实时预览功能
    本文详细介绍了如何在Notepad++中配置Markdown语法高亮和实时预览功能,包括必要的插件安装和设置步骤。 ... [详细]
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 在尝试使用 Android 发送 SOAP 请求时遇到错误,服务器返回 '无法处理请求' 的信息,并指出某个值不能为 null。本文探讨了可能的原因及解决方案。 ... [详细]
  • 本文详细介绍了如何在Android L版本中应用Material Design的主题和布局,包括Material主题的应用方法、自定义主题和颜色方案、状态栏和导航条的自定义,以及Material Design布局的特点和兼容性处理。 ... [详细]
  • JavaScript 实现图片文件转Base64编码的方法
    本文详细介绍了如何使用JavaScript将用户通过文件输入控件选择的图片文件转换为Base64编码字符串,适用于Web前端开发中图片上传前的预处理。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 本文详细介绍了iOS应用的生命周期,包括各个状态及其转换过程中的关键方法调用。 ... [详细]
  • 项目风险管理策略与实践
    本文探讨了项目风险管理的关键环节,包括风险管理规划、风险识别、风险分析(定性和定量)、风险应对策略规划及风险控制。旨在通过系统的方法提升项目成功率,减少不确定因素对项目的影响。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文介绍了Linux操作系统的核心组成部分——内核及其版本分类,以及市面上常见的几种Linux发行版,旨在为初学者提供一个清晰的学习路径。 ... [详细]
author-avatar
魑魅魍魉龌蹉尴尬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有