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熱點,試一試。