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。
点击下载:源码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 近期发现的一些-20190519
下一篇: PHP批量修改文件名称的方法分析
推荐阅读
-
Android自定义Dialog实现文字动态加载效果
-
Android自定义Dialog实现文字动态加载效果
-
Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7)
-
Android自定义view实现阻尼效果的加载动画
-
Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7)
-
Android自定义view实现阻尼效果的加载动画
-
Android UI自定义ListView实现下拉刷新和加载更多效果
-
Android UI自定义ListView实现下拉刷新和加载更多效果
-
Android自定义TextView实现文字倾斜效果
-
Android自定义控件实现icon+文字的多种效果