setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp,
applyAnimationLocked
frameworks/base/services/core/java/com/android/server/wm/WindowStateAnimator.java
applyAnimationLocked
frameworks/base/services/core/java/com/android/server/wm/AppTransition.java
<!-- Standard animations for a full-screen window or activity. -->
<style name="Animation.Activity">
<item name="activityOpenEnterAnimation">@anim/activity_open_enter</item>
<item name="activityOpenExitAnimation">@anim/activity_open_exit</item>
<item name="activityCloseEnterAnimation">@anim/activity_close_enter</item>
<item name="activityCloseExitAnimation">@anim/activity_close_exit</item>
<!-- Standard animations for a non-full-screen window or activity. -->
<style name="Animation.Dialog">
<item name="windowEnterAnimation">@anim/activity_open_enter</item>
<item name="windowExitAnimation">@anim/activity_close_exit</item>
</style>
animLp.toString()
01-01 20:01:24.779 1780 1799 D WindowManager: fullscreenanim animLp.toString()-=WM.LayoutParams{(0,0)(fillxfill) sim=#120 ty=1 fl=#810500 fmt=-3 wanim=0x1030001 or=0 needsMenuKey=2}
01-01 20:01:24.779 1780 1799 D WindowManager: fullscreenanim animLp.toString()-=WM.LayoutParams{(0,0)(fillxfill) sim=#20 ty=3 fl=#1830118 pfl=0x11 wanim=0x1030001 or=0 needsMenuKey=2}
if (wtoken.appFullscreen) {
WindowState ws =wtoken.findMainWindow();
if (ws != null) {
animLp = ws.mAttrs;
bestAnimLayer = ws.mLayer;
fullscreenAnim = true;
}
else if (!fullscreenAnim) {
WindowState ws = wtoken.findMainWindow();
if (ws != null) {
if (ws.mLayer > bestAnimLayer) {
animLp = ws.mAttrs;
bestAnimLayer = ws.mLayer;
// Determine the visible rect to calculate the thumbnail clip
WindowState win = atoken.findMainWindow();
Rect containingFrame = new Rect(0, 0, width, height); //父窗口大小
Rect contentInsets = new Rect(); //窗口的内容区域边衬
Rect appFrame = new Rect(0, 0, width, height); //窗口大小
Animation a = mAppTransition.loadAnimation(lp, transit, enter, width, height, mCurConfiguration.orientation, containingFrame, contentInsets, appFrame, isVoiceInteraction);
atoken.mAppAnimator.setAnimation(a, width, height,
WindowManagerService服务刷新系统UI是通过调用WindowManagerService类的成员函数performLayoutAndPlaceSurfacesLockedInner来实现的
//计算实际要显示的大小和位置
w.computeShownFrameLocked();
重写UnRect(int[] data)
(0, 0, 0, width, 0, height ,width, height);
String TRAPEZOID_DEFAULT = "0-0-1280-0-0-720-1280-720-";
mDataStorage = DataStorage.getInstance(context);
String dataStr = mDataStorage.readDataStorage(TRAPEZOID, TRAPEZOID_DEFAULT, STORAGE_TYPE);
int data[]=new int[8];
String[] strs = dataStr.split("-");
for(int i=0; i<strs.length; i++) {
data[i]=Integer.parseInt(strs[i]);
}
动画时间和具体缩放动作:
diff --git a/frameworks/base/core/java/android/view/animation/Animation.java b/frameworks/base/core/java/android/view/animation/Animation.java
index be43952..070f916 100644
--- a/frameworks/base/core/java/android/view/animation/Animation.java
+++ b/frameworks/base/core/java/android/view/animation/Animation.java
@@ -839,7 +839,7 @@ public abstract class Animation implements Cloneable {
}
final long startOffset = getStartOffset();
- final long duration = mDuration;
+ final long duration = SystemProperties.getInt("App.Animation", 2000);;//mDuration;
float normalizedTime;
if (duration != 0) {
normalizedTime = ((float) (currentTime - (mStartTime + startOffset))) /
diff --git a/frameworks/base/core/java/android/view/animation/ScaleAnimation.java b/frameworks/base/core/java/android/view/animation/ScaleAnimation.java
index e9a8436..158989c 100644
--- a/frameworks/base/core/java/android/view/animation/ScaleAnimation.java
+++ b/frameworks/base/core/java/android/view/animation/ScaleAnimation.java
@@ -22,6 +22,7 @@ import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.TypedValue;
+import android.util.Log;
/**
* An animation that controls the scale of an object. You can specify the point
* to use for the center of scaling.
@@ -250,6 +251,7 @@ public class ScaleAnimation extends Animation {
sy = mFromY + ((mToY - mFromY) * interpolatedTime);
}
+ Log.d("animation","applyTransformation mFromX="+mFromX+", mToX="+mToX+", mFromY="+mFromY+", mToY="+mToY+", sx="+sx+", sy"+sy+", mPivotX"+mPivotX+", mPivotY"+mPivotY);
if (mPivotX == 0 && mPivotY == 0) {
t.getMatrix().setScale(sx, sy);
} else {