我们都知道在Android中,常见的动画模式有两种:一种是帧动画(Frame Animation),一种是补间动画(Tween Animation)。帧动画是提供了一种逐帧播放图片的动画方式,播放事先做好的图像,与gif图片原理类似,就像是在放电影一样。补间动画可以实现View组件的移动、放大、缩小以及渐变等效果。

今天我们主要来模仿一下美团中加载数据时小人奔跑动画的对话框效果,取个有趣的名字就是Running Man,奔跑吧,兄弟!话不多少,先上效果图,让各位大侠看看是不是你想要实现的效果,然后再决定是否往下阅读,因为做为程序员我们的时间都很宝贵,毕竟还没有女朋友呢?

下面讲讲实现的原理,首先我们在项目的res目录下新建一下anim文件夹,然后新建一个xml文件,代码如下:

android:oneshot="false" >

android:drawable="@drawable/app_loading0"

android:duration="150"/>

android:drawable="@drawable/app_loading1"

android:duration="150"/>

animation-list 是动画列表,中间放很多的item 也就是组成帧动画的图片,

android:drawable[drawable]//加载Drawable对象

android:duration[long]//每一帧动画的持续时间(单位ms) android:oneshot[boolean]//动画是否只运行一次,true运行一次,false重复运行

写好之后我们来看自定义一个对话框,来实现打开对话框时,自动加载奔跑的动画。见代码:

/**

* @Description:自定义对话框

* @author http://blog.csdn.net/finddreams

*/

public class CustomProgressDialog extends ProgressDialog {

private AnimationDrawable mAnimation;

private Context mContext;

private ImageView mImageView;

private String mLoadingTip;

private TextView mLoadingTv;

private int count = 0;

private String oldLoadingTip;

private int mResid;

public CustomProgressDialog(Context context, String content, int id) {

super(context);

this.mContext = context;

this.mLoadingTip = content;

this.mResid = id;

setCanceledOnTouchOutside(true);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initView();

initData();

}

private void initData() {

mImageView.setBackgroundResource(mResid);

// 通过ImageView对象拿到背景显示的AnimationDrawable

mAnimation = (AnimationDrawable) mImageView.getBackground();

// 为了防止在onCreate方法中只显示第一帧的解决方案之一

mImageView.post(new Runnable() {

@Override

public void run() {

mAnimation.start();

}

});

mLoadingTv.setText(mLoadingTip);

}

public void setContent(String str) {

mLoadingTv.setText(str);

}

private void initView() {

setContentView(R.layout.progress_dialog);

mLoadingTv = (TextView) findViewById(R.id.loadingTv);

mImageView = (ImageView) findViewById(R.id.loadingIv);

}

}

可以看到在代码中,我们使用到一个imageview.post(Runnable r)方法,因为帧动画需要不断的重画,所以必须在线程中运行,否则只能看到第一帧的效果,这和我们做游戏的原理是一样的,一个人物的走动,是有线程在控制图片的不断重画。

当然还有另外一个方法也能实现:

@Override

public void onWindowFocusChanged(boolean hasFocus) {

// TODO Auto-generated method stub

mAnimation.start();

super.onWindowFocusChanged(hasFocus);

}

最后就是在Activity中调用了

CustomProgressDialog dialog =new CustomProgressDialog(this, "正在加载中",R.anim.frame);

dialog.show();

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

android 动画进度控制,Android仿美团加载数据、小人奔跑进度动画对话框实现方法...相关推荐

  1. Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果)...

    Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果) 首句依然是那句老话,你懂得! finddreams :(http://blog.csdn.net/finddr ...

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

    我们都知道在Android中,常见的动画模式有两种:一种是帧动画(Frame Animation),一种是补间动画(Tween Animation).帧动画是提供了一种逐帧播放图片的动画方式,播放事先 ...

  3. 安卓学习笔记---Android仿美团加载数据、小人奔跑进度动画对话框(以及顺丰快递员奔跑效果)

    最近要加一个动态的加载功能,类似于美团的效果,这篇文章写的很好,可以借鉴 博客地址: http://blog.csdn.net/jdsjlzx/article/details/43489395 我们都 ...

  4. Android开发之通过接口回调机制加载数据(源代码分享)

    Android开发之通过接口回调机制加载数据的简单实现,在实际开发中通过callback方法得到网络加载的数据的使用频率远比通过直接开启线程或异步任务加载数据的频率高的多,这篇文章的代码将简单实现该机 ...

  5. android加载h5页面加进度条,使用Android仿微信加载H5页面的进度条

    这篇文章主要为大家详细介绍了Android仿微信加载H5页面进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 前言 Android中WebView打卡前端页面时受到网路环境,页面内容大小的影响 ...

  6. WinForm中异步加载数据并使用进度条

    在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的.因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应:其次可 ...

  7. Android 帧动画,加载动画,AnimationDrawable,仿京东加载动画

    1.创建drawable文件ring_animation.xml <?xml version="1.0" encoding="utf-8"?> &l ...

  8. android progressbar 加载数据,ProgressBar的使用实例

    以下内容有三方式设置进度条 设置一个简单的进度条 布局 android:id="@+id/progressBar" style="?android:attr/progre ...

  9. Android之Launcher分析和修改4——初始化加载数据

    上面一篇文章说了Launcher是如何被启动的,Launcher启动的过程主要是加载界面数据然后显示出来, 界面数据都是系统APP有关的数据,都是从Launcher的数据库读取,下面我们详细分析Lau ...

  10. WebView之加载网页时增加进度提示

    上一节讲了一些webview的基本使用以及在记载网页时如何屏蔽掉第三方浏览器,使我们自己开发的程序成为一个微型浏览器.那么这一节将一下在webView加载网页的过程中如何加上进度提示.效果图如下: 主 ...

最新文章

  1. Codeforces 903F Clear The Matrix(状态压缩DP)
  2. WCF入门(三)——对象序列化
  3. 【机器学习实战】第1章 机器学习基础
  4. Mybatis入门及于hibernate的区别
  5. 逻辑漏洞-token绕过
  6. 2019你还没搭建个人博客吗?进来看看
  7. linux c统计进程网络读写,linux网络分析、性能分析、文本格式化、文件读写操作之利器(mtr、top、jq、sponge)...
  8. linux时间和win10差8小时,[转载]Ubuntu16.04与Win10时间差8个小时问题解决方案
  9. k8s学习:部署 PHP + Redis 留言薄
  10. wcf中的几个配置问题
  11. docker容器跨宿主机通信
  12. 医院药品管理系统java sql_医院药品管理系统设计(Netbeans,Myeclipse,MySQL,SQLServer)
  13. 数论1.0 数论基础
  14. adc0808温度换算公式_多路温度采集与控制(C51、ADC0808)
  15. 谷歌浏览器上不了网如何设置_如何解决电脑网络连接正常却上不了网
  16. 代做linux作业,Linux系统管理第七周作业【Linux微职位】(示例代码)
  17. mach_absolute_time 高效计算时间差
  18. 面试题:十瓶牛奶每天至少喝一瓶,直到喝完到底有多少种喝法
  19. 写给程序员看的项目管理入门
  20. STM32硬件实现 CRC-16/MODBUS

热门文章

  1. 【启动】Windows上启动图形化软件,报错: 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll...
  2. 一文搞懂JVM内存结构
  3. 电容触摸按键实验(STM32F407)
  4. 医院随访系统标准化流程之三级随访
  5. PR曲线与ROC曲线绘制
  6. 开氏温度与摄氏度换算_政策丨车厢温度变化2……冷藏保温车国标开始征求意见...
  7. [GUET-CTF2019]NO SOS(考点:古典密码,培根加密)
  8. Python 文本处理的几个库
  9. 软件测试工程师在不同阶段需要掌握的技能
  10. 软件测试 中静态测试与动态测试的区别