Android仿美團(tuán)加載數(shù)據(jù)、小人奔跑進(jìn)度動(dòng)畫(huà)對(duì)話框?qū)崿F(xiàn)方法

我們都知道在Android中,常見(jiàn)的動(dòng)畫(huà)模式有兩種:一種是幀動(dòng)畫(huà)(Frame Animation),一種是補(bǔ)間動(dòng)畫(huà)(Tween Animation)。幀動(dòng)畫(huà)是提供了一種逐幀播放圖片的動(dòng)畫(huà)方式,播放事先做好的圖像,與gif圖片原理類(lèi)似,就像是在放電影一樣。補(bǔ)間動(dòng)畫(huà)可以實(shí)現(xiàn)View組件的移動(dòng)、放大、縮小以及漸變等效果。

今天我們主要來(lái)模仿一下美團(tuán)中加載數(shù)據(jù)時(shí)小人奔跑動(dòng)畫(huà)的對(duì)話框效果,取個(gè)有趣的名字就是Running Man,奔跑吧,兄弟!話不多少,先上效果圖,讓各位大俠看看是不是你想要實(shí)現(xiàn)的效果,然后再?zèng)Q定是否往下閱讀,因?yàn)樽鰹槌绦騿T我們的時(shí)間都很寶貴,畢竟還沒(méi)有女朋友呢?

下面講講實(shí)現(xiàn)的原理,首先我們?cè)陧?xiàng)目的res目錄下新建一下anim文件夾,然后新建一個(gè)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 是動(dòng)畫(huà)列表,中間放很多的item 也就是組成幀動(dòng)畫(huà)的圖片,
android:drawable[drawable]//加載Drawable對(duì)象
android:duration[long]//每一幀動(dòng)畫(huà)的持續(xù)時(shí)間(單位ms) android:oneshot[boolean]//動(dòng)畫(huà)是否只運(yùn)行一次,true運(yùn)行一次,false重復(fù)運(yùn)行

寫(xiě)好之后我們來(lái)看自定義一個(gè)對(duì)話框,來(lái)實(shí)現(xiàn)打開(kāi)對(duì)話框時(shí),自動(dòng)加載奔跑的動(dòng)畫(huà)。見(jiàn)代碼:

/** 
* @Description:自定義對(duì)話框 
* @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);  
    // 通過(guò)ImageView對(duì)象拿到背景顯示的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);  
}  

 }  

可以看到在代碼中,我們使用到一個(gè)imageview.post(Runnable r)方法,因?yàn)閹瑒?dòng)畫(huà)需要不斷的重畫(huà),所以必須在線程中運(yùn)行,否則只能看到第一幀的效果,這和我們做游戲的原理是一樣的,一個(gè)人物的走動(dòng),是有線程在控制圖片的不斷重畫(huà)。
當(dāng)然還有另外一個(gè)方法也能實(shí)現(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();  

對(duì)于CustomProgressDialog這個(gè)自定義對(duì)話框類(lèi)是封裝的比較好的,調(diào)用起來(lái)十分方便,你可以快速的替換成你想要的效果,只需更改圖片就可以了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,954評(píng)論 25 709
  • 平時(shí),別人無(wú)論聊什么我是插不上話的,沒(méi)那個(gè)技能。 比如說(shuō)有一次身邊人表示她很喜歡某攝影師,據(jù)說(shuō)還挺出名的,我隨口插...
    唐晟藝閱讀 211評(píng)論 1 1
  • 拉美人大多熱情,我去智利的時(shí)候已經(jīng)無(wú)比強(qiáng)烈感受到這一點(diǎn)。但當(dāng)時(shí)一哥倫比亞朋友告訴我,不,智利人太冷了,要是你去哥倫...
    金小金閱讀 5,886評(píng)論 0 2
  • 生涯規(guī)劃路上故事系列:當(dāng)年孫悟空從一只普通的石猴變成法力無(wú)窮的孫大圣,有一個(gè)蛻變的故事。今天,我有故事,我有方法,...
    曉亮sz閱讀 293評(píng)論 0 0

友情鏈接更多精彩內(nèi)容