Android仿美团加载数据、小人奔跑进度动画对话框(附顺丰快递员奔跑效果)

简介:
我们都知道在Android中,常见的动画模式有两种:一种是帧动画 (Frame Animation) ,一种是补间动画( Tween Animation)。帧动画是提供了一种逐帧播放图片的动画方式,播放事先做好的图像,与gif图片原理类似,就像是在放电影一样。补间动画可以实现View组件的移动、放大、缩小以及渐变等效果。
 
   今天我们主要来模仿一下美团中加载数据时小人奔跑动画的对话框效果,取个有趣的名字就是Running Man,奔跑吧,兄弟!话不多少,先上效果图,让各位大侠看看是不是你想要实现的效果,然后再决定是否往下阅读,因为做为程序员我们的时间都很宝贵,毕竟还没有女朋友呢?
(ps:因为技术原因,提供的动态图效果不是很明显,但在手机上运行是非常好的,有兴趣的朋友可以下载源码看看。)


    下面讲讲实现的原理,首先我们在项目的res目录下新建一下anim文件夹,然后新建一个xml文件,添加如下代码:
[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:oneshot="false" >  
  4.   
  5.     <item  
  6.         android:drawable="@drawable/app_loading0"  
  7.         android:duration="150"/>  
  8.     <item  
  9.         android:drawable="@drawable/app_loading1"  
  10.         android:duration="150"/>  
  11.   
  12. </animation-list>  
 
animation-list 是动画列表,中间放很多的item 也就是组成帧动画的图片,
android:drawable[drawable]//加载Drawable对象
android:duration[long]//每一帧动画的持续时间(单位ms)
     android:oneshot[boolean]//动画是否只运行一次,true运行一次,false重复运行

 写好之后我们来看自定义一个对话框,来实现打开对话框时,自动加载奔跑的动画。见代码:
[java]  view plain copy
  1. /** 
  2.  * @Description:自定义对话框 
  3.  * @author http://blog.csdn.net/finddreams 
  4.  */  
  5. public class CustomProgressDialog extends ProgressDialog {  
  6.   
  7.     private AnimationDrawable mAnimation;  
  8.     private Context mContext;  
  9.     private ImageView mImageView;  
  10.     private String mLoadingTip;  
  11.     private TextView mLoadingTv;  
  12.     private int count = 0;  
  13.     private String oldLoadingTip;  
  14.     private int mResid;  
  15.   
  16.     public CustomProgressDialog(Context context, String content, int id) {  
  17.         super(context);  
  18.         this.mContext = context;  
  19.         this.mLoadingTip = content;  
  20.         this.mResid = id;  
  21.         setCanceledOnTouchOutside(true);  
  22.     }  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         initView();  
  28.         initData();  
  29.     }  
  30.   
  31.     private void initData() {  
  32.   
  33.         mImageView.setBackgroundResource(mResid);  
  34.         // 通过ImageView对象拿到背景显示的AnimationDrawable  
  35.         mAnimation = (AnimationDrawable) mImageView.getBackground();  
  36.         // 为了防止在onCreate方法中只显示第一帧的解决方案之一  
  37.         mImageView.post(new Runnable() {  
  38.             @Override  
  39.             public void run() {  
  40.                 mAnimation.start();  
  41.   
  42.             }  
  43.         });  
  44.         mLoadingTv.setText(mLoadingTip);  
  45.   
  46.     }  
  47.   
  48.     public void setContent(String str) {  
  49.         mLoadingTv.setText(str);  
  50.     }  
  51.   
  52.     private void initView() {  
  53.         setContentView(R.layout.progress_dialog);  
  54.         mLoadingTv = (TextView) findViewById(R.id.loadingTv);  
  55.         mImageView = (ImageView) findViewById(R.id.loadingIv);  
  56.     }  
  57.   
  58. }  

         可以看到在代码中,我们使用到一个imageview.post(Runnable r)方法,因为帧动画需要不断的重画,所以必须在线程中运行,否则只能看到第一帧的效果,这和我们做游戏的原理是一样的,一个人物的走动,是有线程在控制图片的不断重画。
   当然还有另外一个方法也能实现:
[java]  view plain copy
  1. @Override  
  2.     public void onWindowFocusChanged(boolean hasFocus) {  
  3.         // TODO Auto-generated method stub  
  4.         mAnimation.start();   
  5.         super.onWindowFocusChanged(hasFocus);  
  6.     }  
     
    最后就是在Activity中调用了,详情:
[java]  view plain copy
  1. CustomProgressDialog dialog =new CustomProgressDialog(this"正在加载中",R.anim.frame);  
  2.         dialog.show();  

        对于CustomProgressDialog这个自定义对话框类是封装的比较好的,调用起来十分方便,你可以快速的替换成你想要的效果,只需更改图片就可以了。

最后附上源代码,还不够理解的朋友可以下载看看,希望对你有所帮助;
相关文章
|
3月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
38 0
|
3天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
5 0
|
3天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
5 0
|
17天前
|
XML Java Android开发
Android每点击一次按钮就添加一条数据
Android每点击一次按钮就添加一条数据
21 1
|
1月前
|
Android开发
[Android]AlertDialog对话框
[Android]AlertDialog对话框
15 0
|
1月前
|
存储 Android开发 C++
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
30 3
|
2月前
|
JavaScript Java 数据安全/隐私保护
安卓逆向 -- POST数据解密
安卓逆向 -- POST数据解密
25 2
|
3月前
|
编解码 测试技术 开发工具
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
|
3月前
|
数据采集 编解码 图形学
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
100 0
|
3月前
|
JSON Java Android开发
Android网络和数据交互: 请解释Android中的JSON解析库,如Gson。
Android网络和数据交互: 请解释Android中的JSON解析库,如Gson。
24 0