Android實現(xiàn)仿美團、順豐快遞數(shù)據(jù)加載效果
我們都知道在Android中,常見的動畫模式有兩種:一種是幀動畫(Frame Animation),一種是補間動畫(Tween Animation)。幀動畫是提供了一種逐幀播放圖片的動畫方式,播放事先做好的圖像,與gif圖片原理類似,就像是在放電影一樣。補間動畫可以實現(xiàn)View組件的移動、放大、縮小以及漸變等效果。
今天我們主要來模仿一下美團中加載數(shù)據(jù)時小人奔跑動畫的對話框效果,取個有趣的名字就是Running Man,奔跑吧,兄弟!話不多少,先上效果圖,讓各位大俠看看是不是你想要實現(xiàn)的效果,然后再決定是否往下閱讀,因為做為程序員我們的時間都很寶貴,畢竟還沒有女朋友呢?
(ps:因為技術原因,提供的動態(tài)圖效果不是很明顯,但在手機上運行是非常好的,有興趣的朋友可以下載源碼看看。)
下面講講實現(xiàn)的原理,首先我們在項目的res目錄下新建一下anim文件夾,然后新建一個xml文件,添加如下代碼:
<?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>
animation-list 是動畫列表,中間放很多的item 也就是組成幀動畫的圖片,
android:drawable[drawable]//加載Drawable對象
android:duration[long]//每一幀動畫的持續(xù)時間(單位ms)
android:oneshot[boolean]//動畫是否只運行一次,true運行一次,false重復運行
寫好之后我們來看自定義一個對話框,來實現(xiàn)打開對話框時,自動加載奔跑的動畫。見代碼:
/** * @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)方法,因為幀動畫需要不斷的重畫,所以必須在線程中運行,否則只能看到第一幀的效果,這和我們做游戲的原理是一樣的,一個人物的走動,是有線程在控制圖片的不斷重畫。
當然還有另外一個方法也能實現(xiàn):
@Override public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub mAnimation.start(); super.onWindowFocusChanged(hasFocus); }
最后就是在Activity中調(diào)用了,詳情:
CustomProgressDialog dialog =new CustomProgressDialog(this, "正在加載中",R.anim.frame); dialog.show();
對于CustomProgressDialog這個自定義對話框類是封裝的比較好的,調(diào)用起來十分方便,你可以快速的替換成你想要的效果,只需更改圖片就可以了。
以上就是本篇文章的全部內(nèi)容,大家在測試后如果還有任何不明白的地方可以在下方的留言區(qū)域?qū)д摚兄x你對腳本之家的支持。
相關文章
Android鍵盤輸入語言設置默認打開myanmar緬甸語的步驟
如何實現(xiàn)Android鍵盤輸入語言默認打開為myanmar緬甸語,如果要設置某種語言在輸入法默認打開可按一下步驟添加文件,我這里已經(jīng)驗證時OK的2013-06-06