android中的動畫

學習筆記,僅供自己參考,如有不對歡迎指正

android中的動畫

(圖片使用來自網絡,對圖片作者便是感謝,如有任何問題,通知會刪除)
Android 動畫可以歸納為以下幾種:

  • 補間動畫(View 動畫)
    使用場景:
    1.可以來做過度動畫比如popwindow的顯示隱藏
    2.activity的進入退出
    3.ViewGroup的進場動畫
    android:layoutAnimation="@anim/anim_layout",anim_layout 就是 ViewGroup 中子控件在第一次顯示時的進場動畫效果。
  • 幀動畫
    沒什么可說的
  • 屬性動畫

1. ValueAnimator:
只需要提供初始值和結束值,ValueAnimator會自動平滑的從完成起止的動畫效果。內部使用一種時間循環的機制來計算值與值之間的動畫過渡
2. ObjectAnimator:
繼承自ValueAnimator,底層的動畫實現機制基于ValueAnimator。相對于ValueAnimator只能對view進行平滑的動畫過度,ObjectAnimator可以對任意對象的任意屬性進行動畫操作,如View的alpha屬性。

val animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f)
animator.duration = 5000
animator.start()

3. Interpolator:控制動畫的變化速率
4. ViewPropertyAnimator:對View使用動畫提供的一種便捷機制
比如我們相對一個view執行復雜的動畫集合,就可以如下調用

textview.animate().x(500).y(500).setDuration(5000)
        .setInterpolator(new BounceInterpolator());

不使用ViewPropertyAnimator,則需要自己去創建ObjectAnimator去實現

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 0f);
animator.start();

  • 觸摸反饋動畫(Ripple Effect)
    觸摸時間會叫哥onTouchEvent來處理。膜拜大神:https://hencoder.com/ui-3-1/
    自定義觸摸反饋的關鍵:
    1.重寫 onTouchEvent(),在里面寫上你的觸摸反饋算法,并返回 true(關鍵是 ACTION_DOWN 事件時返回 true)。
    2.如果是會發生觸摸沖突的 ViewGroup,還需要重寫 onInterceptTouchEvent(),在事件流開始時返回 false,并在確認接管事件流時返回一次 true,以實現對事件的攔截。
    3.當子 View 臨時需要阻止父 View 攔截事件流時,可以調用父 View 的 requestDisallowInterceptTouchEvent() ,通知父 View 在當前事件流中不再嘗試通過 onInterceptTouchEvent() 來攔截。

  • 揭露動畫(Reveal Effect)
    使用場景:activity切換的view顯示隱藏

    image
    image
  • 轉場動畫 & 共享元素
    轉場動畫主要用在activity切換時
    共享元素主要在兩個切換的頁面有共同的元素,重點兩個:
    1)transitionName是關鍵屬性
    2)延遲動畫postponeEnterTransition()結束頁面調用supportFinishAfterTransition()

    image
  • 視圖狀態動畫(Animate View State Changes)
    比如被點擊、選中等時候的動畫

    image
  • 矢量圖動畫(Vector 動畫)
    關于矢量圖可以參考:http://www.lxweimin.com/p/977147b8f3eb?utm_campaign
    1.矢量圖的優缺點
    優點:
    1.完美的適配性
    2.體積更小
    3.放大縮小,不失真
    缺點:
    1.5.0以下不支持
    2.不支持硬件加速,過于復雜的圖片加載效率低,不建議
    2.矢量圖使用 drawable > 右鍵 > new > Vector Asset-local file(設計師給的圖)

    image
    image

矢量圖在布局文件中使用

<ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:scaleType="fitXY"
        app:srcCompat="@drawable/ic_clear_black_24dp"
        />

3.矢量動畫分為三種:
1.屬性變換,與補間動畫一樣
2.路徑繪制

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:interpolator="@android:interpolator/linear"
    android:propertyName="trimPathEnd"
    android:valueFrom="0"
    android:valueTo="1"
    android:valueType="floatType" />

image

3.路徑變換

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
  android:duration="3000"
  android:propertyName="pathData"
  android:valueFrom="@string/path_begin"
  android:valueTo="@string/path_end"
  android:valueType="pathType"
  android:interpolator="@android:anim/accelerate_interpolator"/>

image
  • 約束布局實現的關鍵幀動畫(ConstraintSet 動畫)
    關鍵:指定動畫指定開頭和結尾的兩個關鍵幀
    比如改變一個view的大小、間距、透明度等等。會真正改變view的狀態,比如將view長度變為0,它原來的位置點擊將無效。示例代碼
private var mConstraintSet2: ConstraintSet? = null
    private var mConstraintSet1: ConstraintSet? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)

        val mConstraintLayout = findViewById<ConstraintLayout>(R.id.mConstraintLayout)
        mConstraintSet2 = ConstraintSet()
        mConstraintSet1 = ConstraintSet()
        mConstraintSet2?.clone(mConstraintLayout)
        mConstraintSet1?.clone(mConstraintLayout)

        findViewById<Button>(R.id.jumpBt).setOnClickListener {
            TransitionManager.beginDelayedTransition(mConstraintLayout);
            mConstraintSet2?.constrainWidth(R.id.tv02,0)
            mConstraintSet2?.applyTo(mConstraintLayout)
        }

        findViewById<Button>(R.id.jumpBt2).setOnClickListener {
            TransitionManager.beginDelayedTransition(mConstraintLayout);
            mConstraintSet1?.applyTo(mConstraintLayout);
        }
    }

參考文章:https://mp.weixin.qq.com/s/Xk_dEG3tEMS-Cqd5fd-56Q

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

推薦閱讀更多精彩內容

  • 1:逐幀動畫 在res/drawable目錄下新建動畫XML文件,如下所示 設置背景,如下: 在java文件中啟動...
    名字_都被占了閱讀 477評論 0 0
  • Android中動畫分為:View動畫、幀動畫(也屬于View動畫)、屬性動畫。View動畫是對View做圖形變換...
    胡飛洋閱讀 696評論 1 1
  • 文章主要內容來源《Android開發藝術探索》,部分內容來源網上的文章,文中會有鏈接。 Android系統提供了兩...
    developerzjy閱讀 1,774評論 0 5
  • 動畫可以分為三類:View動畫,幀動畫,屬性動畫。 一、View動畫 1.View動畫包括四種:平移動畫,縮放動畫...
    銅角大王閱讀 226評論 0 0
  • Android中的動畫主要有幀動畫、補間動畫、屬性動畫(3.0之后出現),此處按照官方將其分為兩大類記錄。他們之間...
    KwokKwok閱讀 337評論 0 1