摘要:動畫占用大量內(nèi)存,如何優(yōu)化使用動畫的注意事項有哪些問題這個問題主要出現(xiàn)在幀動畫中,當(dāng)圖片數(shù)量較多且圖片較大時就極易出現(xiàn),這個在實際開發(fā)中要尤其注意,盡量避免使用幀動畫。
目錄介紹
4.0.0.1 Android中有哪幾種類型的動畫,屬性動畫和補(bǔ)間動畫有何區(qū)別?補(bǔ)間動畫和屬性動畫常用的有哪些?
4.0.0.2 View動畫為何不能真正改變View的位置?而屬性動畫為何可以?屬性動畫是如何改變View的屬性?
4.0.0.3 補(bǔ)間動畫是如何作用于view的,從源碼角度分析以下?為何說補(bǔ)間動畫沒有改變View的屬性?
4.0.0.6 屬性動畫插值器和估值器的作用?插值器和估值器分別是如何更改動畫的?
4.0.0.7 使用動畫會出現(xiàn)哪些問題?動畫占用大量內(nèi)存,如何優(yōu)化?使用動畫的注意事項有哪些?
好消息博客筆記大匯總【15年10月到至今】,包括Java基礎(chǔ)及深入知識點,Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善……開源的文件是markdown格式的!同時也開源了生活博客,從12年起,積累共計500篇[近100萬字],將會陸續(xù)發(fā)表到網(wǎng)上,轉(zhuǎn)載請注明出處,謝謝!
鏈接地址:https://github.com/yangchong2...
如果覺得好,可以star一下,謝謝!當(dāng)然也歡迎提出建議,萬事起于忽微,量變引起質(zhì)變!所有的筆記將會更新到GitHub上,同時保持更新,歡迎同行提出或者push不同的看法或者筆記!
4.0.0.1 Android中有哪幾種類型的動畫,屬性動畫和補(bǔ)間動畫有何區(qū)別?
常見三類動畫
View動畫(View Animation)/補(bǔ)間動畫(Tween animation):對View進(jìn)行平移、縮放、旋轉(zhuǎn)和透明度變化的動畫,不能真正的改變view的位置。應(yīng)用如布局動畫、Activity切換動畫
逐幀動畫(Drawable Animation):是View動畫的一種,它會按照順序播放一組預(yù)先定義好的圖片
屬性動畫(Property Animation):對該類對象進(jìn)行動畫操作,真正改變了對象的屬性
屬性動畫和補(bǔ)間動畫區(qū)別
屬性動畫才是真正的實現(xiàn)了view的移動,補(bǔ)間動畫對view的移動更像是在不同地方繪制了一個影子,實際對象還是處于原來的地方。當(dāng)動畫的repeatCount設(shè)置為無限循環(huán)時,如果在Activity退出時沒有及時將動畫停止,屬性動畫會導(dǎo)致Activity 無法釋放而導(dǎo)致內(nèi)存泄漏,而補(bǔ)間動畫卻沒問題。xml文件實現(xiàn)的補(bǔ)間動畫,復(fù)用率極高。在 Activity切換,窗口彈出時等情景中有著很好的效果。
補(bǔ)間動畫還有一個致命的缺陷,就是它只是改變了View的顯示效果而已,而不會真正去改變View的屬性。什么意思呢?比如說,現(xiàn)在屏幕的左上角有一個按鈕,然后我們通過補(bǔ)間動畫將它移動到了屏幕的右下角,現(xiàn)在你可以去嘗試點擊一下這個按鈕,點擊事件是絕對不會觸發(fā)的,因為實際上這個按鈕還是停留在屏幕的左上角,只不過補(bǔ)間動畫將這個按鈕繪制到了屏幕的右下角而已。下面這張圖摘自網(wǎng)絡(luò)!
補(bǔ)間動畫和幀動畫xml文件存放的位置
補(bǔ)間動畫是放置到res/anim/下面
幀動畫是放置到res/drawable/下面,子節(jié)點為animation-list,在這里定義要顯示的圖片和每張圖片的顯示時長
補(bǔ)間動畫和屬性動畫常用的有哪些?技術(shù)博客大總結(jié)
View動畫框架是舊的框架,只能用于Views。比較容易設(shè)置和能滿足許多應(yīng)用程序的需要。View動畫框架中一共提供了AlphaAnimation(透明度動畫)、RotateAnimation(旋轉(zhuǎn)動畫)、ScaleAnimation(縮放動畫)、TranslateAnimation(平移動畫)四種類型的補(bǔ)間動畫;并且View動畫框架還提供了動畫集合類(AnimationSet),通過動畫集合類(AnimationSet)可以將多個補(bǔ)間動畫以組合的形式顯示出來。
與屬性動畫相比View動畫存在一個缺陷,View動畫改變的只是View的顯示,而沒有改變View的響應(yīng)區(qū)域,并且View動畫只能對View做四種類型的補(bǔ)間動畫。因此Google在Android3.0(API級別11)及其后續(xù)版本中添加了屬性動畫框架,從名稱中就可以知道只要某個類具有屬性(即該類含有某個字段的set和get方法),那么屬性動畫框架就可以對該類的對象進(jìn)行動畫操作(其實就是通過反射技術(shù)來獲取和執(zhí)行屬性的get,set方法),同樣屬性動畫框架還提供了動畫集合類(AnimatorSet),通過動畫集合類(AnimatorSet)可以將多個屬性動畫以組合的形式顯示出來。
4.0.0.2 View動畫為何不能真正改變View的位置?而屬性動畫為何可以?屬性動畫是如何改變View的屬性?
View動畫為何不能真正改變View的位置?而屬性動畫為何可以?
View動畫改變的只是View的顯示,而沒有改變View的響應(yīng)區(qū)域;而屬性動畫會通過反射技術(shù)來獲取和執(zhí)行屬性的get、set方法,從而改變了對象位置的屬性值。
Animation產(chǎn)生的動畫數(shù)據(jù)實際并不是應(yīng)用在View本身的,而是應(yīng)用在RenderNode或者Canvas上的,這就是為什么Animation不會改變View的屬性的根本所在。
屬性動畫是如何改變View的屬性?
具體看我這篇博客:https://www.jianshu.com/p/4af...
4.0.0.3 補(bǔ)間動畫是如何作用于view的,從源碼角度分析以下?為何說補(bǔ)間動畫沒有改變View的屬性?
關(guān)于補(bǔ)間動畫原理
要了解Android動畫是如何加載出來的,我們首先要了解Android View 是如何組織在一起的.每個窗口是一顆View樹. RootView是DecorView,在布局文件中聲明的布局都是DecorView的子View.是通過setContentView來設(shè)置進(jìn)入窗口內(nèi)容的. 因為View的布局就是一棵樹.所以繪制的時候也是按照樹形結(jié)構(gòu)來遍歷每個View進(jìn)行繪制.ViewRoot.java中 draw函數(shù)準(zhǔn)備好Canvas后 調(diào)用 mView.draw(canvas),這里的mView是DecorView.
下面看一下遞歸繪制的幾個步驟:技術(shù)博客大總結(jié)
1.繪制背景
2.如果需要,保存畫布(canvas),為淡入淡出做準(zhǔn)備
3.通過調(diào)用View.onDraw(canvas)繪制View本身的內(nèi)容
4.通過 dispatchDraw(canvas)繪制自己的孩子,dispatchDraw->drawChild->child.draw(canvas) 這樣的調(diào)用過程被用來保證每個子 View 的 draw 函數(shù)都被調(diào)用
5.如果需要,繪制淡入淡出相關(guān)的內(nèi)容并恢復(fù)保存的畫布所在的層(layer)
6.繪制修飾的內(nèi)容(例如滾動條)
當(dāng)一個 ChildView 要重畫時,它會調(diào)用其成員函數(shù) invalidate() 函數(shù)將通知其 ParentView 這個 ChildView 要重畫,這個過程一直向上遍歷到 ViewRoot,當(dāng) ViewRoot 收到這個通知后就會調(diào)用上面提到的 ViewRoot 中的 draw 函數(shù)從而完成繪制。Android 動畫就是通過 ParentView 來不斷調(diào)整 ChildView 的畫布坐標(biāo)系來實現(xiàn)的
如何計算補(bǔ)間動畫數(shù)據(jù)
首先進(jìn)入Animation類,然后找到getTransformation方法,主要是分析這個方法邏輯,如圖所示
那么這個方法中做了什么呢?Animation在其getTransformation函數(shù)被調(diào)用時會計算一幀動畫數(shù)據(jù),而上面這些屬性基本都是在計算動畫數(shù)據(jù)時有相關(guān)的作用。
第一步:若startTime為START_ON_FIRST_FRAME(值為-1)時,將startTime設(shè)定為curTime
第二步:計算當(dāng)前動畫進(jìn)度:
normalizedTime = (curTime - (startTime + startOffset))/duration
若mFillEnabled==false:將normalisedTime夾逼至[0.0f, 1.0f]
第三步:判斷是否需要計算動畫數(shù)據(jù):
若normalisedTime在[0.0f, 1.0f],需計算動畫數(shù)據(jù)
若normalisedTime不在[0.0f, 1.0f]:
normalisedTime<0.0f, 僅當(dāng)mFillBefore==true時才計算動畫數(shù)據(jù)
normalisedTime>1.0f, 僅當(dāng)mFillAfter==true時才計算動畫數(shù)據(jù)
第四步:若需需要計算動畫數(shù)據(jù):
若當(dāng)前為第一幀動畫,觸發(fā)mListener.onAnimationStart
若mFillEnabled==false:將normalisedTime夾逼至[0.0f, 1.0f]
根據(jù)插間器mInterpolator調(diào)整動畫進(jìn)度:
interpolatedTime = mInterpolator.getInterpolation(normalizedTime)
若動畫反轉(zhuǎn)標(biāo)志位mCycleFlip為true,則
interpolatedTime = 1.0 - normalizedTime
調(diào)用動畫更新函數(shù)applyTransformation(interpolatedTime, transformation)計算出動畫數(shù)據(jù)
第五步:若夾逼之前normalisedTime大于1.0f, 則判斷是否需繼續(xù)執(zhí)行動畫:
已執(zhí)行次數(shù)mRepeatCount等于需執(zhí)行次數(shù)mRepeated
若未觸發(fā)mListener.onAnimationEnd,則觸發(fā)之
已執(zhí)行次數(shù)mRepeatCount不等于需執(zhí)行次數(shù)mRepeated技術(shù)博客大總結(jié)
自增mRepeatCount
重置mStartTime為-1
若mRepeatMode為REVERSE,則取反mCycleFlip
觸發(fā)mListener.onAnimationRepeat
4.0.0.6 屬性動畫插值器和估值器的作用?插值器和估值器分別是如何更改動畫的?
插值器(Interpolator):根據(jù)時間流逝的百分比計算出當(dāng)前屬性值改變的百分比。確定了動畫效果變化的模式,如勻速變化、加速變化等等。View動畫和屬性動畫均可使用。常用的系統(tǒng)內(nèi)置插值器:
線性插值器(LinearInterpolator):勻速動畫
加速減速插值器(AccelerateDecelerateInterpolator):動畫兩頭慢中間快
減速插值器(DecelerateInterpolator):動畫越來越慢
類型估值器(TypeEvaluator):根據(jù)當(dāng)前屬性改變的百分比計算出改變后的屬性值。針對于屬性動畫,View動畫不需要類型估值器。常用的系統(tǒng)內(nèi)置的估值器:技術(shù)博客大總結(jié)
整形估值器(IntEvaluator)
浮點型估值器(FloatEvaluator)
Color屬性估值器(ArgbEvaluator)
4.0.0.7 使用動畫會出現(xiàn)哪些問題?動畫占用大量內(nèi)存,如何優(yōu)化?使用動畫的注意事項有哪些?
使用動畫會出現(xiàn)哪些問題?
OOM問題:這個問題主要出現(xiàn)在幀動畫中,當(dāng)圖片數(shù)量較多且圖片較大時就極易出現(xiàn)OOM,這個在實際開發(fā)中要尤其注意,盡量避免使用幀動畫。
內(nèi)存泄露:在屬性動畫中有一類無限循環(huán)的動畫,這類動畫需要在Activity退出時及時停止,否則將導(dǎo)致Activity無法釋放從而造成內(nèi)存泄露,通過驗證后發(fā)現(xiàn)View動畫并不存在此問題。
動畫占用大量內(nèi)存,如何優(yōu)化?
使用動畫的注意事項有哪些?
OOM問題:這個問題主要出現(xiàn)在幀動畫中,當(dāng)圖片數(shù)量較多且圖片較大時就極易出現(xiàn)OOM,這個在實際開發(fā)中要尤其注意,盡量避免使用幀動畫。
內(nèi)存泄露:在屬性動畫中有一類無限循環(huán)的動畫,這類動畫需要在Activity退出時及時停止,否則將導(dǎo)致Activity無法釋放從而造成內(nèi)存泄露,通過驗證后發(fā)現(xiàn)View動畫并不存在此問題。
兼容性問題:動畫在3.0以下的系統(tǒng)有兼容性問題,在某些特殊場景可能無法正常工作,因此要做好適配工作。
View動畫的問題:View動畫是對View的影像做動畫,并不是真正改變View的狀態(tài),因此有時候會出現(xiàn)動畫完成后View無法隱藏的現(xiàn)象,即setVisibility(View.GOEN)失效了,這個時候只要調(diào)用view.clearAnimation()清除View動畫即可解決問題。技術(shù)博客大總結(jié)
不要使用px:在進(jìn)行動畫的過程中,要盡量使用dp,使用px會導(dǎo)致在不用的設(shè)備上有不用的效果。
動畫元素的交互:從3.0開始,將view移動(平移)后,屬性動畫的單擊事件觸發(fā)位置為移動后的位置,但是View動畫仍然在原位置。在Android3.0以前的系統(tǒng)中,不管是View動畫還是屬性動畫,新位置都無法觸發(fā)單擊事件同時,老位置仍然能觸發(fā)單擊事件(因為屬性動畫在Android3.0以前是沒有的,是通過兼容包實現(xiàn)的,底層也是調(diào)用View動畫)。
硬件加速:使用動畫的過程中,建議開啟硬件加速,這樣會提高動畫的流暢性。
開啟方法:
在你的Android manifest文件,添加hardwareAccelerated屬性就可以了。可以給整個application添加,也可以多帶帶給一個acitivty添加,該屬性默認(rèn)值為false;
關(guān)于其他內(nèi)容介紹 01.關(guān)于博客匯總鏈接1.技術(shù)博客匯總
2.開源項目匯總
3.生活博客匯總
4.喜馬拉雅音頻匯總
5.其他匯總
02.關(guān)于我的博客我的個人站點:www.yczbj.org, www.ycbjie.cn
github:https://github.com/yangchong211
知乎:https://www.zhihu.com/people/...
簡書:http://www.jianshu.com/u/b7b2...
csdn:http://my.csdn.net/m0_37700275
喜馬拉雅聽書:http://www.ximalaya.com/zhubo...
開源中國:https://my.oschina.net/zbj161...
泡在網(wǎng)上的日子:http://www.jcodecraeer.com/me...
郵箱:yangchong211@163.com
阿里云博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV
segmentfault頭條:https://segmentfault.com/u/xi...
掘金:https://juejin.im/user/593943...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72930.html
摘要:廣義說一切通過改變的視覺呈現(xiàn)都叫動畫例如,按鈕,鏈接等元素交互反饋。狹義說通過定時器連續(xù)調(diào)用函數(shù)進(jìn)行元素屬性改變產(chǎn)生的視覺動畫效果。 廣義說:一切通過js改變的視覺呈現(xiàn)都叫動畫;例如,按鈕,鏈接等元素交互反饋。狹義說:通過定時器連續(xù)調(diào)用js函數(shù)進(jìn)行元素屬性改變產(chǎn)生的視覺動畫效果。 定時器 定時器是JavaScript動畫的核心技術(shù);setTimeout(),setInterval()是...
摘要:廣義說一切通過改變的視覺呈現(xiàn)都叫動畫例如,按鈕,鏈接等元素交互反饋。狹義說通過定時器連續(xù)調(diào)用函數(shù)進(jìn)行元素屬性改變產(chǎn)生的視覺動畫效果。 廣義說:一切通過js改變的視覺呈現(xiàn)都叫動畫;例如,按鈕,鏈接等元素交互反饋。狹義說:通過定時器連續(xù)調(diào)用js函數(shù)進(jìn)行元素屬性改變產(chǎn)生的視覺動畫效果。 定時器 定時器是JavaScript動畫的核心技術(shù);setTimeout(),setInterval()是...
摘要:概述是現(xiàn)代瀏覽器提供的用來檢測變化的網(wǎng)頁接口。比如通知用戶當(dāng)前所在的頁面所發(fā)生的一些變化。觸發(fā)回調(diào)前返回最新的批量變化。在函數(shù)內(nèi)部,開始必須使用代碼進(jìn)行檢查,確保是我們所監(jiān)聽的動畫。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原理的第十章。 網(wǎng)絡(luò)應(yīng)用...
摘要:概述是現(xiàn)代瀏覽器提供的用來檢測變化的網(wǎng)頁接口。比如通知用戶當(dāng)前所在的頁面所發(fā)生的一些變化。觸發(fā)回調(diào)前返回最新的批量變化。在函數(shù)內(nèi)部,開始必須使用代碼進(jìn)行檢查,確保是我們所監(jiān)聽的動畫。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原理的第十章。 網(wǎng)絡(luò)應(yīng)用...
閱讀 2067·2021-11-24 09:39
閱讀 773·2021-09-30 09:48
閱讀 974·2021-09-22 15:29
閱讀 2409·2019-08-30 14:17
閱讀 1885·2019-08-30 13:50
閱讀 1336·2019-08-30 13:47
閱讀 977·2019-08-30 13:19
閱讀 3418·2019-08-29 16:43