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

 更新时间:2016年08月29日 15:14:21   作者:lv_fq  
这篇文章主要为大家详细介绍了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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@drawable/shape_dialog_bg"
 android:orientation="vertical"
 android:padding="10dp">

 <TextView
  android:id="@+id/tv_loading"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_margin="20dp"
  android:text="加载中..."
  android:textSize="16sp" />

 <ProgressBar
  android:id="@+id/pb"
  style="@android:style/Widget.ProgressBar.Horizontal"
  android:layout_width="match_parent"
  android:layout_height="10dp"
  android:max="100"
  android:progressDrawable="@drawable/layer_list_progress_drawable" />


</LinearLayout>

因为没想到其他的思路,所以,只能通过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里面直接调用的。

<TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:clickable="true"
  android:onClick="tvClick"
  android:padding="10dp"
  android:text="点击弹框" />

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。

点击下载:源码

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

相关文章

  • android 获取手机中的所有图片或某一目录下的图片方法

    android 获取手机中的所有图片或某一目录下的图片方法

    下面小编就为大家分享一篇android 获取手机中的所有图片或某一目录下的图片方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • Android编程调用系统自带的拍照功能并返回JPG文件示例【附demo源码下载】

    Android编程调用系统自带的拍照功能并返回JPG文件示例【附demo源码下载】

    这篇文章主要介绍了Android编程调用系统自带的拍照功能并返回JPG文件,结合实例形式分析了Android的拍照功能调用及图形文件操作技巧,并附带demo源码供读者下载参考,需要的朋友可以参考下
    2017-07-07
  • Android使用ContentProvider实现查看系统短信功能

    Android使用ContentProvider实现查看系统短信功能

    这篇文章主要为大家详细介绍了Android使用ContentProvider实现查看系统短信功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 规避Android开发中内存泄漏陷阱的解决方案

    规避Android开发中内存泄漏陷阱的解决方案

    在Android开发中,内存泄漏是一个常见但容易被忽视的问题,它会导致应用程序占用过多的内存资源,最终影响应用的性能和用户体验,本文将深入探讨Android常见的内存泄漏问题,并提供优化指南,需要的朋友可以参考下
    2024-05-05
  • Android实现关机重启的方法分享

    Android实现关机重启的方法分享

    这篇文章主要介绍了Android实现关机重启的方法,需要的朋友可以参考下
    2014-02-02
  • Android自定义View实现角度选择器

    Android自定义View实现角度选择器

    前几天在Google Photos查看照片,用了一下它的图片剪裁功能,于是我马上就被其界面和操作吸引。后来想模仿做一个和Google Photos裁图页面几乎一模一样的角度选择器,本文比较基础,在阅读本文前只需要掌握最基础的自定义View知识和Android事件知识。下面来一起学习下吧。
    2016-11-11
  • 详解如何使用Android Studio开发Gradle插件

    详解如何使用Android Studio开发Gradle插件

    这篇文章主要介绍了详解如何使用Android Studio开发Gradle插件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Android横竖屏幕切换生命周期详解

    Android横竖屏幕切换生命周期详解

    这篇文章主要为大家详细介绍了Android横竖屏幕切换生命周期,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Android实现摇一摇功能

    Android实现摇一摇功能

    这篇文章主要为大家详细介绍了Android实现摇一摇功能的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 微信公众平台开发入门教程(图文详解)

    微信公众平台开发入门教程(图文详解)

    由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下
    2013-09-09

最新评论