WindowStateAnimator筆記,animatorstateinfo

來源:互聯網
上載者:User

WindowStateAnimator筆記,animatorstateinfo

最近在研究WMS,文章僅記錄自己的一點理解,僅供自己參考。

這篇文章主要講WindowStateAnimator的一些關鍵變數和函數。

視窗動畫有可能是是來自視窗本身所設定的動畫,也有可能是來自於其宿主Activity組件所設定的切換動畫。WindowStateAnimator是一個視窗本身動畫類,每一個WindowState都有一個WindowStateAnimator對象成員,AppWindowAnimator類是用來描述Activity組件的切換動畫。WindowStateAnimator跟WindowAnimator容易搞混,WindowManagerService中只有一個WindowAnimator對象,並且每個WindowStateAnimator、AppWindowToken對象都會儲存WindowAnimator對象的引用,

其實從名字可以可以看出WindowStateAnimator只是管理與之對應WindowState的動畫,而WindowAnimator是要管理所有視窗動畫,不知理解的對不對。

1、mAnimating

表示視窗是否處於正在顯示動畫的過程中。

2、mLocalAnimating

表示視窗的動畫是否已經初始化過了。一個動畫只有經過初始化之後,才能開始執行。

3、mAnimationIsEntrance

mAnimationIsEntrance記錄動畫類型,是退出還是進入動畫。applyAnimationLocked()函數中會更新這個變數。

4、mAnimation

動畫對象。

5、mHasTransformation

表示Activity組件是否具有切換動畫。

6、mHasLocalTransformation

表示視窗本身是否具有切換動畫,這個也不太好理解。

6、mLocalAnimating

mLocalAnimating表示現正播放視窗本身動畫。

7、mTransformation

mTransformation是一個矩陣變換類Transformation對象,裡面儲存著一個apha通道值,一個3*3矩陣Matrix,這個變數只有在播視窗動畫的時候才會更改。android定義了一些可用的動畫,比如漸層、縮小、放大、切換等,這些動畫都實現了applyTransformation()函數,如果自訂動畫,那麼也要實現這個方法,這個方法的輸入是當前的一個描述進度的浮點數(0.0 ~ 1.0), 輸出是一個Transformation,儲存在mTransformation中。視窗本身動畫和Activity動畫的調用代碼流程如下。

①WindowManagerService.scheduleAnimationLocked()-->WindowAnimator.mAnimationRunnable.run()-->WindowAnimator.animateLocked()-->WindowAnimator.performAnimationsLocked()-->WindowAnimator.updateWindowsLocked()-->WindowStateAnimator.stepAnimationLocked()--> WindowStateAnimator.stepAnimation()-->Animation.getTransformation() -->Animation.applyTransformation()。

②WindowManagerService.scheduleAnimationLocked()-->WindowAnimator.mAnimationRunnable.run()-->WindowAnimator.animateLocked()-->WindowAnimator.updateAppWindowsLocked()-->AppWindowAnimator.stepAnimationLocked() -->AppWindowAnimator.stepAnimation()-->Animation.getTransformation() -->Animation.applyTransformation()。

③WindowAnimator.animateLocked()-->WindowStateAnimator.prepareSurfaceLocked()-->WindowStateAnimator.computeShownFrameLocked()。

Animation的原理很簡單,就是定時重繪圖形。“ 控制動畫的‘人’, 它通常通過向定時器Choreographer 註冊一個Runnable對象來實現定時觸發,在回呼函數裡它要做兩件事情:1. 從Animation那裡擷取新的Transform, 2. 將Transform裡的值更新底層參數,為接下來的重繪做準備。動畫可以發生在Window上,也可以發生在某個具體的View。前者的動畫會通過SurfaceControl直接在某個Surface上進行操作,比如設定Alpha值。後者則通過OpenGL完成(產生DisplayList).”。

“針對不同對象的Animator. WindowAnimator, 負責整個螢幕的動畫,比如說轉屏,它提供Runnable實現。WindowStateAnimator, 負責ViewRoot,即某一個視窗的動畫。AppWindowAnimator, 負責應用啟動和退出時候的動畫。這幾個Animator都會提供一個函數,stepAnimationLocked(), 它會完成一個動畫動作的一系列工作,從計算Transformation到更新Surface的Matrix.”從代碼調用來看,這個結論好像不太對,但也差不多是這樣。

8、mSurfaceControl

SurfaceControl對象,這個不用解釋,學習過SurfaceFlinger的都知道。

9、mDrawState

表示該視窗的繪製狀態,有5個狀態:NO_SURFACE、DRAW_PENDING、COMMIT_DRAW_PENDING、READY_TO_SHOW、HAS_DRAWN.

NO_SURFACE代表該視窗無Surface,即mSurfaceControl為null。有必要說一下什麼時候會銷毀一個視窗的Surface,①relayoutWindow()一個視窗時,如果該視窗不可見,那麼調用destroySurfaceLocked()銷毀Surface,壁紙視窗例外;②一個視窗WindowManager.LayoutParams.FORMAT發生變化時需銷毀之前的Surface;③remove移除一個視窗。

DRAW_PENDING代表該視窗已經準備好Surface,但是還沒有繪製Draw過。








筆記本 Window7遊戲 怎全屏

Win鍵+R鍵,開啟運行視窗,輸入regedit 斷行符號
這樣開啟了登錄編輯程式,
然後,定位到以下位置:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\GraphicsDrivers\Configuration\
在Configuration這上面右鍵,選擇尋找,輸入Scaling,在右框找到scaling,右鍵scaling修改
將數值改為3即可(原值是4)
 
windowXP系統筆記本串連無線網,這台電腦怎做wifi熱點

安裝個軟體Connectify,可以做為wifi熱點,試一試。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.