導航:首頁 > 操作系統 > android動畫插值器

android動畫插值器

發布時間:2023-09-15 04:16:05

android屬性動畫詳解

在 Android 動畫中,總共有兩種類型的動畫View Animation(視圖動畫)和Property Animator(屬性動畫);其中
View Animation包括Tween Animation(補間動畫)和Frame Animation(逐幀動畫);
Property Animator包括ValueAnimator和ObjectAnimation;
首先,直觀上,他們有如下三點不同:
1、引入時間不同: View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才開始有Property Animation相關的API。
2、所在包名不同: View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。
3、動畫類的命名不同: View Animation中動畫類取名都叫XXXXAnimation,而在Property Animator中動畫類的取名則叫XXXXAnimator大家都知道逐幀動畫主要是用來實現動畫的,而補間動畫才能實現控制項的漸入漸出、移動、旋轉和縮放的;而Property Animator是在Android 3.0版本才引入的,之前是沒有的。
為什麼還要引入Property Animator呢?
1、為什麼引入Property Animator(屬性動畫)
我提出一個假設:請問大家,如何利用補間動畫來將一個控制項的背景色在一分鍾內從綠色變為紅色?這個效果想必沒辦法僅僅通過改變控制項的漸入漸出、移動、旋轉和縮放來實現吧,而這個效果是可以通過Property Animator完美實現的
**這就是第一個原因:Property Animator能實現補間動畫無法實現的功能 **大家都知道,補間動畫和逐幀動畫統稱為View Animation,也就是說這兩個動畫只能對派生自View的控制項實例起作用;而Property Animator則不同,從名字中可以看出屬性動畫,應該是作用於控制項屬性的!正因為屬性動畫能夠只針對控制項的某一個屬性來做動畫,所以也就造就了他能單獨改變控制項的某一個屬性的值!比如顏色!這就是Property Animator能實現補間動畫無法實現的功能的最重要原因。
**我們得到了第二點不同:View Animation僅能對指定的控制項做動畫,而Property Animator是通過改變控制項某一屬性值來做動畫的。
**假設我們將一個按鈕從左上角利用補間動畫將其移動到右下角,在移動過程中和移動後,這個按鈕都是不會響應點擊事件的。這是為什麼呢?因為補間動畫僅僅轉變的是控制項的顯示位置而已,並沒有改變控制項本身的值。View Animation的動畫實現是通過其Parent View實現的,在View被drawn時Parents View改變它的繪制參數,這樣雖然View的大小或旋轉角度等改變了,但View的實際屬性沒變,所以有效區域還是應用動畫之前的區域;我們看到的效果僅僅是系統作用在按鈕上的顯示效果,利用動畫把按鈕從原來的位置移到了右下角,但按鈕內部的任何值是沒有變化的,所以按鈕所捕捉的點擊區域仍是原來的點擊區域。(下面會舉例來說明這個問題)
這就得到了第三點不同:補間動畫雖能對控制項做動畫,但並沒有改變控制項內部的屬性值。而Property Animator則是恰恰相反,Property Animator是通過改變控制項內部的屬性值來達到動畫效果的

我們前面講了Property Animator包括ValueAnimator和ObjectAnimator;這篇文章就主要來看看ValueAnimator的使用方法吧。
我覺得谷歌那幫老頭是最會起名字的人,單從命名上,就能看出來這個東東的含義。ValueAnimator從名字可以看出,這個Animation是針對值的! ValueAnimator不會對控制項做任何操作,我們可以給它設定從哪個值運動到哪個值,通過監聽這些值的漸變過程來自己操作控制項。 它會自己計算動畫的過程,然後我們需要監聽它的動畫過程來自己操作控制項。

這就是ValueAnimator的功能:ValueAnimator對指定值區間做動畫運算,我們通過對運算過程做監聽來自己操作控制項。
總而言之就是兩點:
1. ValueAnimator只負責對指定的數字區間進行動畫運算
2. 我們需要對運算過程進行監聽,然後自己對控制項做動畫操作

插值器的意義其實就相當於物理公式中的加速度參數,所以這也就是它也叫加速器的原因。 如何自定義插值器:

**input參數與任何我們設定的值沒關系,只與時間有關,隨著時間的增長,動畫的進度也自然的增加,input參數就代表了當前動畫的進度。而返回值則表示動畫的當前數值進度 **

在getInterpolation函數中,我們將進度反轉過來,當傳0的時候,我們讓它數值進度在完成的位置,當完成的時候,我們讓它在開始的位置

ObjectAnimator是派生自ValueAnimator的,所以ValueAnimator中所能使用的方法,在ObjectAnimator中都可以正常使用。ObjectAnimator重寫了幾個方法,比如ofInt(),ofFloat()等。利用ObjectAnimator重寫的ofFloat方法如何實現一個動畫:(改變透明度)

前面我們都是定義多個值,即至少兩個值之間的變化,那如果我們只定義一個值呢,如下面的方式:(同樣以MyPointView為例)

僅且僅當我們只給動畫設置一個值時,程序才會調用屬性對應的get函數來得到動畫初始值。如果動畫沒有初始值,那麼就會使用系統默認值。比如ofInt()中使用的參數類型是int類型的,而系統的Int值的默認值是0,所以動畫就會從0運動到100;也就是系統雖然在找到不到屬性對應的get函數時,會給出警告,但同時會用系統默認值做為動畫初始值。
如果通過給自定義控制項MyPointView設置了get函數,那麼將會以get函數的返回值做為初始值。

根據 View setBackGroundColor() 方法可以自定義條用屬性動畫。

Ⅱ Android動畫之ViewPropertyAnimator(專用於view的屬性動畫)

屬性動畫對比原來的視圖動畫有很多的優點,屬性動畫可以對所有的對象做動畫操作,但Android開發中需要做動畫最多的還是View,如果只是對一個view做動畫,很少的幾個屬性還行,如果是對同一個view的十幾個屬性同時做動畫,相信屬性動畫的寫法是比較繁瑣的。ViewPropertyAnimator從名字就可以看出是專用於View的屬性動畫,在API12被提供。ViewPropertyAnimator專用於操作View動畫,語法更加簡潔,使用更加方便。
developer: https://developer.android.google.cn/reference/android/view/ViewPropertyAnimator

如何獲取ViewPropertyAnimator 對象:
ViewPropertyAnimator 沒有構造函數,通過View.animate()方法可以方便的獲取ViewPropertyAnimator 對象,此時獲取的動畫對象就專用於操作當前view。

setDuration(); //設置動畫時長
setInterpolator(); //設置插值器
setStartDelay(); //設置延遲開始時間
start(); //立刻開始動畫
cancel(); //取消動畫

明顯看到圖片先往下走了一段,然後向左的動畫才開始執行。

鏈式操作
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).translationY(300).scaleX(0.5f);

以上函數的執行,會導致相同動畫的cancle,以上函數都是除了坐標相關都是以view左上角為坐標原點。

方法都比較簡單,下面距幾個列子:

首先利用translationX,translationXBy來區分By的意義:
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationY(300);

ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationYBy(300);

translationYBy 可以多次移動View,translationY多次執行沒有效果。

ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).x(100).y(100);

ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).rotation(270);

據觀察withEndAction相當於動畫開始,withStartAction相當於動畫結束。

可以看到可以添加setUpdateListener監聽,但無法通過這個監聽函數監聽到當前動畫的信息,所以這個監聽函數可能用處不大。

Animation動畫概述和執行原理
Android動畫之補間動畫TweenAnimation
Android動畫之逐幀動畫FrameAnimation
Android動畫之插值器簡介和系統默認插值器
Android動畫之插值器Interpolator自定義
Android動畫之視圖動畫的缺點和屬性動畫的引入
Android動畫之ValueAnimator用法和自定義估值器
Android動畫之ObjectAnimator實現補間動畫和ObjectAnimator自定義屬性
Android動畫之ObjectAnimator中ofXX函數全解析-自定義Property,TypeConverter,TypeEvaluator
Android動畫之AnimatorSet聯合動畫用法
Android動畫之LayoutTransition布局動畫
Android動畫之共享元素動畫
Android動畫之ViewPropertyAnimator(專用於view的屬性動畫)
Android動畫之Activity切換動畫overridePendingTransition實現和Theme Xml方式實現
Android動畫之ActivityOptionsCompat概述
Android動畫之場景變換Transition動畫的使用
Android動畫之Transition和TransitionManager使用
Android動畫之圓形揭露動畫Circular Reveal
Android 動畫之 LayoutAnimation 動畫
Android動畫之視圖動畫的缺點和屬性動畫的引入

Ⅲ Android 動畫詳解

  android中酷炫的效果,都離不開動畫的支持。這里我們詳細介紹一下android中動畫的分類。android的中動畫分為幀動畫、補間動畫、屬性動畫。原理各不相同,實現的效果也大不相同。下面一一講解三種動畫。

  幀動畫顧名思義就是通過順序一幀一幀播放圖片從而產生動畫效果,效果類似放電影。該動畫缺點比較明顯,就是如果圖片過大過多會導致OOM。幀動畫xml文件放置在drawable目錄下而非anim文件夾下。

  補間動畫是通過對view進行旋轉、縮放、漸變、透明度變化,而達到的一種動畫效果。是一種漸進式動畫。並且可以通過組合以上四種操作,完成復雜的自定義動畫效果。缺點就是只是改變的view的展示狀態,但是不會改變view的位置。例如我們將一個button通過位移想左移動100dp,然後停留在終點。但是我們可以發現展示的位置button點擊無效果,不可以交互。而在button原始位置空白的地方點擊會觸發button的點擊效果。也就是button本質還是在原來位置,只是展示左移了100dp。

透明度動畫,通過改變view的透明度展示動畫。對應AlphaAnimation和<alpha>xml標簽

縮放動畫,通過修改view的大小展示動畫。對應ScaleAnimation類和<scale>xml表情

通過旋轉view展示動畫。對應RotateAnimation類和<rotate>xml標簽

平移動畫,更改view的展示位置展示動畫。對應TranslateAnimation類和<translate>xml表情

應用動畫xml配置

使用java類配置動畫,具體參數類同xml參數,建議使用xml配置動畫

  屬性動畫本質是通過改變對象的屬性(例如:x,y等屬性),來實現動畫的,所以基本上是無所不能的,只要對象有這個屬性,就能實現動畫效果。屬性動畫是在api11的新特性,通過動態的改變view的屬性從而達到動畫效果。雖然可以使用nineoldandroid庫向下兼容,但是兼容本質是使用補間動畫完成,也就是說不會更改view的屬性,也不會更改view的位置。屬性動畫比較常用的類: ValueAnimator、ObjectAnimator、AnimationSet,其中ObjectAnimator是ValueAnimator的子類,而AnminationSet是動畫集合

動畫配置同樣可以使用xml配置,參數類似,這里不做詳細說明。

根據時間流逝百分比計算當前屬性改變百分比。同xml配置動畫中的 android:interpolator 屬性配置,常見有LinearInterpolator(線性差值器)、(加速減速差值器)
等。自定義需要實現 Interpolator 或者 TimeInterpolator 。Interpolator介面繼承TimeInterpolator。

根據當前屬性改變百分比計算改變後的屬性值。屬性動畫特有的屬性。自定義估值器需要實現 TypeEvaluator 介面。

可以對任意屬性做屬性動畫,屬性動畫要求動畫作用的對象提供該屬性的get()和set()方法。因為屬性動畫本質就是根據外界傳遞的對象屬性的初始值和終點值,然後根據估值器和差值器計算屬性值,不斷調用屬性的set方法,通過時間的推移所傳遞的值,越來越近終點值。
注意:

使用ValueAnimator通過監聽動畫過程,自己改變對象屬性完成動畫

Ⅳ android 屬性動畫是怎樣的

Android的動畫屬性有4種:
Alpha:漸變透明度動畫效果
Scale:漸變尺寸伸縮動畫效果
Translate:畫面轉換位置移動動畫效果
Rotate:畫面旋轉動畫效果

TweenAnimation 通用屬性[類型] 功能 Duration[long] 屬性為動畫持續時間 時間以毫秒為單位
fillAfter[boolean] 當設置為true ,該動畫轉化在動畫結束後被應用
fillBefore[boolean]當設置為true ,該動畫轉化在動畫開始前被應用

interpolator 指定一個動畫的插入器 有一些常見的插入器
accelerate_decelerate_interpolator
加速-減速動畫插入器
accelerate_interpolator
加速-動畫插入器
decelerate_interpolator
減速- 動畫插入器
其他的屬於特定的動畫效果
repeatCount[int] 動畫的重復次數
RepeatMode[int]定義重復的行為 1:重新開始 2:playsbackward
startOffset[long] 動畫之間的時間間隔,從上次動畫停多少時間開始執行下個動畫
zAdjustment[int] 定義動畫的Z Order的改變0:保持Z Order不變
1:保持在最上層
-1:保持在最下層
-->
<!-- 尺寸伸縮動畫效果 scale

屬性:interpolator 指定一個動畫的插入器

有三種動畫插入器:
accelerate_decelerate_interpolator 加速-減速動畫插入器
accelerate_interpolator 加速-動畫插入器
decelerate_interpolator 減速- 動畫插入器

其他的屬於特定的動畫效果
fromXScale屬性為動畫起始時X坐標上的伸縮尺寸
toXScale 屬性為動畫結束時X坐標上的伸縮尺寸

fromYScale屬性為動畫起始時Y坐標上的伸縮尺寸
toYScale 屬性為動畫結束時Y坐標上的伸縮尺寸

說明:
以上四種屬性值
0.0表示收縮到沒有
1.0表示正常無伸縮
值小於1.0表示收縮
值大於1.0表示放大

pivotX 屬性為動畫相對於物件的X坐標的開始位置
pivotY 屬性為動畫相對於物件的Y坐標的開始位置
說明:
以上兩個屬性值從0%-100%中取值
50%為物件的X或Y方向坐標上的中點位置
長整型值:
ration 屬性為動畫持續時間
說明: 時間以毫秒為單位

布爾型值:
fillAfter屬性當設置為true ,該動畫轉化在動畫結束後被應用
-->
<!--
畫面轉換位置移動動畫效果translate

fromXDeltatoXDelta 為動畫、結束起始時 X坐標上的位置
fromYDeltatoYDelta 為動畫、結束起始時 Y坐標上的位置
-->

<!--
畫面轉移旋轉動畫效果rotate

fromDegrees為動畫起始時物件的角度 說明
當角度為負數——表示逆時針旋轉
當角度為正數——表示順時針旋轉
(負數from——to正數:順時針旋轉)
(負數from——to負數:逆時針旋轉)
(正數from——to正數:順時針旋轉)
(正數from——to負數:逆時針旋轉)
toDegrees 屬性為動畫結束時物件旋轉的角度 可以大於360度
pivotX
pivotY 為動畫相對於物件的X、Y坐標的開始位 說明:以上兩個屬性值從0%-100%中取值
50%為物件的X或Y方向坐標上的中點位置
-->

Ⅳ 知識體系四:Android動畫工作原理

1.Android 動畫的工作原理?
在android系統中動畫分為兩種分別是幀動畫和屬性動畫。對於動畫的工作原理主要涉及到的是幀動畫的實現。
幀動畫主要有旋轉RotatleAnimation,縮放ScaleAnimation,透明AlphaAnimation,平移TranslateAnimation等都是Animation的子類。Animation控制動畫的效果,Transformation 對動畫進行計算。
對於動畫的原理簡單說就是從一個動畫的啟動狀態,到動畫結束狀態,和動畫持續總時間,在這段時間中任一時間點動畫的狀態計算和顯示的過程。
計算 :是通過Animation的getTransformation()方法首先對時間進行歸一化時間讓時間在0~1之間,進行計算。滿足條件之後就會調用applyTransformation()方法處理實現動畫類型的計算。當前時間點的轉換狀態保存到Transformation 的Matrix中等待顯示的時候使用。
顯示 :動畫顯示工作主要依賴於Choreograther類,此類是線程唯一的,Choreograther和Handler用法類似,都是通過post一個Runnable對象到隊列中等待VSYSC屏幕垂直同步信號刷新(16ms)刷新一次,然後觸發ViewRootImpl的view的遍歷工作,回調到view.draw()方法時就會把之前applyTransformation 計算的此時刻的Transformation 的Matrix賦值到Canvas上, 這也就是為什麼我們使用幀動畫時候我們的view的屬性並沒有改變,這就是根源因為計算得到的Matrix被Canvas使用了,並沒有直接賦值到我們的view上。 對於屬性動畫來說主要使用animator實現看下面解析:

2.Animation 和 Animator 的區別?
Animation和Animator都是抽象類,都有子類,Animation通過Transformation對動畫進行Matrix轉換來作用到Canvas上實現動畫效果。而Animator只是一個工具類,主要是用來控制在一段時間內某一個值的變化過程,然後我們再根據這個值來作用到view的屬性上,以此來實現動畫效果。為了讓這個變化的過程能達到加速減速等變化效果系統提供了插值器Interpolator。他們的實現思想都是一致的。

3.幀動畫 和 屬性動畫的區別?

閱讀全文

與android動畫插值器相關的資料

熱點內容
java獲取網頁url 瀏覽:622
怎麼做解壓神器泡泡版 瀏覽:964
自己動手做一個c編譯器 瀏覽:927
手機如何鏈接谷歌伺服器地址 瀏覽:135
廢掉一個程序員的武功 瀏覽:247
java樹形演算法 瀏覽:639
通達信加鎖指標源碼怎麼看 瀏覽:752
將同名文件移動到部分同名文件夾 瀏覽:401
擺盪指標加壓力線源碼 瀏覽:913
新一代單片機特徵 瀏覽:768
王者的伺服器什麼時候才修好 瀏覽:279
cad歷史命令 瀏覽:39
php博客源代碼 瀏覽:24
cng壓縮機功率 瀏覽:459
pdf批量列印怎麼設置 瀏覽:78
javamap底層 瀏覽:267
賣華為雲伺服器 瀏覽:111
中穎單片機燒錄器 瀏覽:848
pdf轉換成圖片免費軟體 瀏覽:469
編程語言怎麼做出來的 瀏覽:619