当前位置: 移动技术网 > IT编程>移动开发>Android > Android自定义Dialog实现文字动态加载效果

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

淄博市教育信息网,znds网,无双乱舞4.27攻略

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

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

点击下载:

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网