教你一個簡單炫酷的app程序的打開動畫(干貨)

文章同步我的csdn博客
app也是有顏值,動畫就是一種化妝術,他讓你的app更加炫酷,首先給你看下圖

這就是我們今天要做的東西

首先呢,先普及下總體的框架知識,有三種動畫
(1)Drawable Animation:逐幀動畫,就像電影一樣,一幀一幀,拼接在一起在人眼中就是連續的,可以簡單的理解為圖片切換,缺點就是圖片過多或過大會造成oom
(2)View Animation:視圖動畫,比較適合那種不用和用戶交互的東湖
(3)Property Animation:是android 3.0以后加入的,為了解決視圖動畫的缺點,就是組件移動化為實際的移動,現在大部分也用

首先先來講講視圖動畫,也就是這次我們實現上圖效果的方式,有四種動畫方式
這里寫圖片描述


你想一想我們動畫就是會動的畫面(view),總結下來不就是靠這四個行為:改變透明度(那些view逐漸帶化的),view的旋轉,view的移動,view的縮小放大,
有兩種表現方式,一種是java代碼,一種是xml文件,更推薦后一種,可讀性會更強一些,java代碼的 實現方式如下

AlPhaAnimation aa=new AlphaAnimation(0,1);//創建一個透明度動畫實例
aa.setDuration(100);
view.setAnimation(aa);

很簡單吧,其他三種動畫同理,就是構造器不同而已,
現在我們來實現下開篇那個動圖效果,首先我們需要一個布局文件先貼代碼,也就是先把材料準備好

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/blue"
    android:orientation="vertical" >
    <LinearLayout
        android:id="@+id/text_lin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:orientation="vertical" >
        
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="醫立方"
            android:textColor="@color/text_white"
            android:textSize="40sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="好玩的醫立方"
            android:textColor="@color/text_white"
            android:textSize="14sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/text_hide_lin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:background="@color/blue"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="醫立方"
            android:textColor="@color/blue"
            android:textSize="40sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="好玩的醫立方"
            android:textColor="@color/blue"
            android:textSize="14sp" />
    </LinearLayout>

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:src="@mipmap/ic_white_cube" />
</RelativeLayout>

這個布局包括一個ImageView和兩個一模一樣的線性布局(除了字體顏色),用來顯示文字,然后把他們全部居中
這里寫圖片描述

此時或許你會有一個為什么那些字體不顯示,因為他被覆蓋掉了,后面添加布局覆蓋在前一層上面,所以最外層就是一個imageView而已,對于同一個位置的view,后添加的會把前面添加的給覆蓋下去,這對我們后來的字體逐漸出現這是用到這種覆蓋的效果,接下來我們要開始讓這個動畫動起來了,一開始我們先讓圖片先動起來先,首先我把這個動畫分解為4個部分吧,
第一步,自由落體,自然就是用的是位移動畫,并且在這個過程中那個圖片不斷的放大

     <scale
        android:duration="1200"
        android:fromXScale="25%"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromYScale="25%"
        android:toXScale="125%"
        android:toYScale="125%"
        android:interpolator="@android:anim/linear_interpolator"/>

    <translate
        android:duration="1200"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="80%p"
        />

如果你之前沒有接觸過動畫,可能會對這幾個屬性很陌生,首先duration指的就是,這個動畫的持續時間,而fromX(Y)Scale和toX(Y)Scale,指的是圖形x軸y軸放大起始點和終點,在我這里就是將圖片充25%放大到125%,而interpolator這個屬性指的是差值器,也就是用來調整變化的速度,是加速的,減速呢還是變速,有這幾種值


這里寫圖片描述

接下來就是位移動畫,同樣,你想要告訴系統怎么位移肯定也就得告訴他起始點和終點吧,顧名思義,也就是fromX(Y)Delta和toX(Y)Delta啦,這里重要是是講
80%和80%p是什么區別,這里p指的是父類,也就是說,對于位移來說,80%指的是位移自己長度的80%,而80%p指的是位移父類的長度80%,多說無益,上圖


這里寫圖片描述

這里寫圖片描述

這里指展示以父類為標準的,同理沒有p就是以自身為標準

第二部自然就是彈上來又掉下去啦

     <translate
        android:startOffset="1200"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:duration="200"
        android:toYDelta="-15%p"
        />
    <translate
        android:startOffset="1400"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:duration="200"
        android:toYDelta="15%p"
        />

基本和上面差不多,多了一個新東西,也就是startOffset,指的是動畫開始后多少秒執行,這里是1400ms,也就是要在第一步完成之后執行啦

接下來就是第三步啦,這個和第一步類似不過是相反,不是往下掉,二是往上彈,而且這個過程中縮小圖片

<set
        android:startOffset="1600"
        android:interpolator="@android:anim/linear_interpolator">
        <scale
            android:duration="1200"
            android:pivotX="50%"
            android:pivotY="50%"
            android:fromXScale="100%"
            android:fromYScale="100%"
            android:toXScale="80%"
            android:toYScale="80%" />

        <translate
            android:duration="1200"
            android:toXDelta="-20%p"
            android:toYDelta="-50%p"/>
    </set>

第四步啦,也就是字體逐漸顯示,這里你想一想我們現實中的用一塊布這是牌匾,然后將布從左往右啦,那么字體是不是就是從左往右逐漸顯示啦?而所謂的不不就是我在布局中重復定義了,卻把字體設置成和背景一樣顏色的線性布局嘛,先把我們要顯示字體移動到指定位置,這里是向x軸移動自身長度35%,y軸上移動,父類高度的15%,代碼如下

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <translate

        android:fromXDelta="35%"
        android:fromYDelta="15%p"
        android:toXDelta="35%"
        android:toYDelta="15%p"/>
</set>

接下來就是要移動所謂‘拉布’,在這600ms時間內,他就會逐漸把遮住的字逐漸顯示出來啦

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fillAfter="true"
    >
    <translate
        android:fromXDelta="35%"
        android:fromYDelta="15%p"
        android:toXDelta="135%"
        android:toYDelta="15%p"
        />
</set>

最后一步只需要用java代碼把動畫加載進去就可以了

final LinearLayout tv_lin= (LinearLayout) findViewById(R.id.text_lin);//要顯示的字體
        final LinearLayout tv_hide_lin= (LinearLayout) findViewById(R.id.text_hide_lin);//所謂的布
        ImageView logo= (ImageView) findViewById(R.id.image);//圖片
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.splash);
        logo.startAnimation(animation);//開始執行動畫
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                //第一個動畫執行完后執行第二個動畫就是那個字體顯示那部分
                animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.text_splash_position);
                tv_lin.startAnimation(animation);
                animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.text_canvas);
                tv_hide_lin.startAnimation(animation);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

我知道看到這里你肯定還有不懂得地方,我就附上源碼源碼地址

ps:如果你覺得我的文章對你有幫助,那么就頂那里點一下或者github上star一下啦,也可以關注我的公眾號,左上角有二維碼,有什么問題都可以問我,文章會同步發布哦
ps:如果你覺得我文章哪里寫錯了或者哪里太糟糕了,歡迎指出,

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,767評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,495評論 0 17
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,179評論 4 61
  • java NIO(一)Channel nio中的channel與流的區別在于,流的讀寫通常是單向的,而通道可以異步...
    devel_carl閱讀 220評論 0 0
  • 《看圖寫詩——不離不棄》 身上布滿滄桑 一片樹葉的生命也很脆弱 風是殺手之一 你若要走,我也不留 另一片不離不棄 ...
    金書js閱讀 239評論 2 3