热门标签 | 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。

点击下载:源码

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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍如何通过SSH协议使用Xshell远程连接到Ubuntu系统。为了实现这一目标,需要确保Ubuntu系统已安装并配置好SSH服务器,并保证网络连通性。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • moment 国际化设置中文语言 (全局) 及使用示例 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文介绍如何在现有网络中部署基于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社区 版权所有