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

最后附上源代码,还不够理解的朋友可以下载看看,希望对你有所帮助;
相关文章
|
28天前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
111 4
|
4月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
87 2
基于Android P,自定义Android开机动画的方法
|
2月前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
2月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
88 0
|
4月前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
51 0
|
4月前
|
Java Android开发 Kotlin
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
41 0
|
Android开发
android 自定义登陆对话框基类封装,且随着软键盘的弹起自动移动位置
android 自定义登陆对话框基类封装,且随着软键盘的弹起自动移动位置
|
Android开发 数据安全/隐私保护
android自定义对话框实现
android自定义对话框
251 0
android自定义对话框实现
|
Android开发 UED 数据格式
Android项目实战(七):Dialog主题Activity实现自定义对话框效果
原文:Android项目实战(七):Dialog主题Activity实现自定义对话框效果 想必大家都用过Dialog主题的Activity吧,用它来显示自定义对话框效果绝对是一个非常不错的选择。 即把activity交互界面以Dialog的形式展现出来,Dialog主题的Activity大小将以内容的宽高来决定 可以看到设置为Theme.
1810 0