Welcome

首页 / 移动开发 / Android / Android模拟美团客户端进度提示框

用过美团客户端的朋友都知道,美团的加载等待提示很有意思,是一种动画的形式展现给我们,下面我们就对这背后的原理进行了解,然后实现自己的等待动画效果。
首先我们准备两张图片:


这两张图片看起来一模一样啊?细心的朋友会发现唯一不同的就在脚部,OK,我们就利用这两张图片的轮换播放实现动画效果,下面看一下代码:
1.动画文件frame_meituan.xml:

<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false" > <itemandroid:drawable="@drawable/progress_loading_image_01"android:duration="150"/><itemandroid:drawable="@drawable/progress_loading_image_02"android:duration="150"/></animation-list> 
150毫秒进行图片的切换,模拟动画效果。
2.简单自定义一个控件-MeituanProgressDialog.java:


package com.finddreams.runningman;import android.app.ProgressDialog; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView;import com.example.runningman.R;/*** @Description:自定义对话框* @author http://blog.csdn.net/yayun0516*/ public class MeituanProgressDialog 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; /**** @param context* 上下文对象* @param content* 显示文字提示信息内容* @param id* 动画id*/public MeituanProgressDialog(Context context, String content, int id) {super(context);this.mContext = context;this.mLoadingTip = content;this.mResid = id;setCanceledOnTouchOutside(true);} @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initView();initData();} private void initData() { mImageView.setBackgroundResource(mResid);// 通过ImageView对象拿到背景显示的AnimationDrawablemAnimation = (AnimationDrawable) mImageView.getBackground(); mImageView.post(new Runnable() {@Overridepublic 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);}} 
上面用到的提示布局文件的progress_dialog.xml:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:orientation="vertical" > <ImageViewandroid:id="@+id/loadingIv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@anim/frame_meituan"/> <TextViewandroid:id="@+id/loadingTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@+id/loadingIv" android:layout_centerHorizontal="true"android:textSize="20sp"android:text="正在加载中.." /></RelativeLayout> 
最后在Activity中调用:

package com.finddreams.runningman;import com.example.runningman.R;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; /*** @Description: 奔跑小人的动画进度条对话框,可以用作加载数据界面* @author http://blog.csdn.net/yayun0516*/ public class MeiTuanManActivity extends Activity {private MeituanProgressDialog dialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.meituan_progressdialog);}/*** 显示美团进度对话框* @param v*/public void showmeidialog(View v){dialog =new MeituanProgressDialog(this, "正在加载中",R.anim.frame_meituan);dialog.show();Handler handler =new Handler();handler.postDelayed(new Runnable() { @Overridepublic void run() { dialog.dismiss();}}, 3000);//3秒钟后调用dismiss方法隐藏; }} 
最后,让我们的程序跑起来:


ok,跑起来了,你想要加入你的项目,只需要准备两张图片替换下来即可模拟动画。