欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-06 19:37:50
之前在技术问答上面看到一个提问 “加载中…” 后面三个点是动态的,这么一个效果实现。想来想去,好像没想到好的处理方式。 尝试了一下,以一个最笨的方式实现了。先来看一下效...

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

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。

点击下载:源码

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