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

最后附上源代码,还不够理解的朋友可以下载看看,希望对你有所帮助;
相关文章
|
2月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
47 2
基于Android P,自定义Android开机动画的方法
|
2月前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
2月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
50 1
|
2月前
|
缓存 API Android开发
Android经典实战之Kotlin Flow中的3个数据相关的操作符:debounce、buffer和conflate
本文介绍了Kotlin中`Flow`的`debounce`、`buffer`及`conflate`三个操作符。`debounce`过滤快速连续数据,仅保留指定时间内的最后一个;`buffer`引入缓存减轻背压;`conflate`仅保留最新数据。通过示例展示了如何在搜索输入和数据流处理中应用这些操作符以提高程序效率和用户体验。
40 6
|
2月前
|
编解码 网络协议 前端开发
如何实现Android平台GB28181设备接入模块按需打开摄像头并回传数据
后台采集摄像头,如果想再进一步扩展,可以把android平台gb28181的camera2 demo,都移植过来,实现功能更强大的国标设备侧,这里主要是展示,收到国标平台侧的回传请求后,才打开摄像头,才开始编码打包,最大限度的减少资源的占用
|
2月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
|
2月前
|
算法 数据处理 开发工具
Android平台RTSP|RTMP播放器如何回调YUV或RGB数据
在开发Android平台上的RTSP或RTMP播放器时,开发者不仅追求低延迟播放,还希望获取解码后的视频数据(如YUV或RGB格式),以便进行视觉算法分析。使用大牛直播SDK中的SmartPlayer,可在确保播放流畅的同时,通过设置外部渲染器(`SmartPlayerSetExternalRender`)来高效地回调原始视频数据。例如,对于RGBA数据,需实现`NTExternalRender`接口,并重写相关方法以处理数据和尺寸变化。同样地,对于I420(YUV)数据,也需要相应地实现接口以满足需求。这种方式使得开发者能在不影响常规播放功能的情况下,进行定制化的视频处理任务。
|
2月前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
34 0
|
2月前
|
Java Android开发 Kotlin
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
26 0
|
5月前
|
存储 算法 安全
AVB数据解析:Android verified boot 2.0 vbmeta 数据结构解析
AVB数据解析:Android verified boot 2.0 vbmeta 数据结构解析
526 0
下一篇
无影云桌面