Android进阶UI之加载数据等待时,小人奔跑进度动画对话框

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

##2 实现图

这里写图片描述

##3 实现原理

###3.1 首先我们在项目的res目录下新建一下anim文件夹,然后新建一个xml文件

####3.1.1 添加如下代码

<?xml version="1.0" encoding="utf-8"?>  
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
    android:oneshot="false" >  
  
    <item  
        android:drawable="@drawable/app_loading0"  
        android:duration="150"/>  
    <item  
        android:drawable="@drawable/app_loading1"  
        android:duration="150"/>  
  
</animation-list>  

####3.1.2 解析
animation-list//是动画列表,中间放很多的item 也就是组成帧动画的图片
android:drawable[drawable]//加载Drawable对象
android:duration[long]//每一帧动画的持续时间(单位ms)
android:oneshot[boolean]//动画是否只运行一次,true运行一次,false重复运行

###3.2 自定义一个对话框

/** 
 * 自定义对话框 
 * 
 * 使用到一个imageview.post(Runnable r)方法,因为帧动画需要不断的重画,所以必须在线程中运行,否则只能看到第一帧的效果,这和我们做游戏的原理是一样的,一个人物的走动,是有线程在控制图片的不断重画。
 */  
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);  
    }  
  
}  

另外一个方法也能实现:

@Override  
    public void onWindowFocusChanged(boolean hasFocus) {  
        // TODO Auto-generated method stub  
        mAnimation.start();   
        super.onWindowFocusChanged(hasFocus);  
    }  

###3.3 设置背景样式

<style name="loading_dialog" parent="@android:style/Theme.Dialog">
        <!--背景透明-->
        <item name="android:windowBackground">@color/transparent</item>
    </style>

###3.4 在Activity中调用

CustomProgressDialog dialog = new CustomProgressDialog(this, R.style.loading_dialog,
                getString(R.string.loading_loading), R.anim.loading_frame);

##4 源代码

下载链接

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值