国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

04.Android之動畫問題

Muninn / 596人閱讀

摘要:動畫占用大量內(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

相關(guān)文章

  • JS動畫定時器詳解

    摘要:廣義說一切通過改變的視覺呈現(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()是...

    justjavac 評論0 收藏0
  • JS動畫定時器詳解

    摘要:廣義說一切通過改變的視覺呈現(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()是...

    vvpvvp 評論0 收藏0
  • JavaScript 工作原理十-使用 MutationObserver 監(jiān)測 DOM 變化

    摘要:概述是現(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)用...

    bbbbbb 評論0 收藏0
  • JavaScript 工作原理十-使用 MutationObserver 監(jiān)測 DOM 變化

    摘要:概述是現(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)用...

    zone 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<