Merge "Simplify and smooth notification panel animation." into honeycomb

This commit is contained in:
Daniel Sandler
2011-01-20 06:33:44 -08:00
committed by Android (Google) Code Review
3 changed files with 25 additions and 30 deletions

View File

@@ -18,20 +18,13 @@
<com.android.systemui.statusbar.tablet.NotificationPanel <com.android.systemui.statusbar.tablet.NotificationPanel
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui" xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
android:id="@+id/panel_root"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_width="match_parent" android:layout_width="match_parent"
android:gravity="right" android:gravity="right"
android:background="@drawable/notify_panel_bg_protect_tiled"
> >
<View
android:id="@+id/scrim"
android:background="@drawable/notify_panel_bg_protect_tiled"
android:layout_width="512dp"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
/>
<RelativeLayout <RelativeLayout
android:id="@+id/content_parent" android:id="@+id/content_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -88,7 +81,7 @@
android:layout_alignTop="@id/content_parent" android:layout_alignTop="@id/content_parent"
android:layout_alignLeft="@id/content_parent" android:layout_alignLeft="@id/content_parent"
android:layout_marginLeft="100dip" android:layout_marginLeft="100dip"
android:layout_marginTop="-100dip" android:layout_marginTop="50dip"
/> />
</com.android.systemui.statusbar.tablet.NotificationPanel> </com.android.systemui.statusbar.tablet.NotificationPanel>

View File

@@ -54,7 +54,7 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
ViewGroup mContentFrame; ViewGroup mContentFrame;
Rect mContentArea = new Rect(); Rect mContentArea = new Rect();
View mSettingsView; View mSettingsView;
View mScrim, mGlow; View mGlow;
ViewGroup mContentParent; ViewGroup mContentParent;
Choreographer mChoreo = new Choreographer(); Choreographer mChoreo = new Choreographer();
@@ -79,7 +79,6 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
mModeToggle = findViewById(R.id.mode_toggle); mModeToggle = findViewById(R.id.mode_toggle);
mModeToggle.setOnClickListener(this); mModeToggle.setOnClickListener(this);
mScrim = findViewById(R.id.scrim);
mGlow = findViewById(R.id.glow); mGlow = findViewById(R.id.glow);
mSettingsButton = (ImageView)findViewById(R.id.settings_button); mSettingsButton = (ImageView)findViewById(R.id.settings_button);
@@ -192,18 +191,21 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
AnimatorSet mContentAnim; AnimatorSet mContentAnim;
// should group this into a multi-property animation // should group this into a multi-property animation
final int OPEN_DURATION = 136; final int OPEN_DURATION = 250;
final int CLOSE_DURATION = 250; final int CLOSE_DURATION = 250;
// the panel will start to appear this many px from the end // the panel will start to appear this many px from the end
final int HYPERSPACE_OFFRAMP = 30; final int HYPERSPACE_OFFRAMP = 100;
Choreographer() { Choreographer() {
} }
void createAnimation(boolean appearing) { void createAnimation(boolean appearing) {
Animator bgAnim = ObjectAnimator.ofFloat(mScrim, // mVisible: previous state; appearing: new state
"alpha", mScrim.getAlpha(), appearing ? 1 : 0);
View root = findViewById(R.id.panel_root);
Animator bgAnim = ObjectAnimator.ofInt(root.getBackground(), "alpha",
mVisible ? 255 : 0, appearing ? 255 : 0);
float start, end; float start, end;
@@ -213,34 +215,33 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
if (appearing) { if (appearing) {
// we want to go from near-the-top to the top, unless we're half-open in the right // we want to go from near-the-top to the top, unless we're half-open in the right
// general vicinity // general vicinity
start = (y < HYPERSPACE_OFFRAMP) start = (y < HYPERSPACE_OFFRAMP) ? y : HYPERSPACE_OFFRAMP;
? y
: HYPERSPACE_OFFRAMP;
end = 0; end = 0;
} else { } else {
start = y; start = y;
end = y + HYPERSPACE_OFFRAMP; end = y + HYPERSPACE_OFFRAMP;
} }
Animator posAnim = ObjectAnimator.ofFloat(mContentParent, "translationY", start, end); Animator posAnim = ObjectAnimator.ofFloat(mContentParent, "translationY",
start, end);
posAnim.setInterpolator(appearing posAnim.setInterpolator(appearing
? new android.view.animation.DecelerateInterpolator(2.0f) ? new android.view.animation.DecelerateInterpolator(1.0f)
: new android.view.animation.AccelerateInterpolator(2.0f)); : new android.view.animation.AccelerateInterpolator(1.0f));
Animator glowAnim = ObjectAnimator.ofFloat(mGlow, "alpha", Animator glowAnim = ObjectAnimator.ofInt(mGlow.getBackground(), "alpha",
mGlow.getAlpha(), appearing ? 1.0f : 0.0f); mVisible ? 255 : 0, appearing ? 255 : 0);
glowAnim.setInterpolator(appearing glowAnim.setInterpolator(appearing
? new android.view.animation.AccelerateInterpolator(1.0f) ? new android.view.animation.AccelerateInterpolator(1.0f)
: new android.view.animation.DecelerateInterpolator(1.0f)); : new android.view.animation.DecelerateInterpolator(1.0f));
mContentAnim = new AnimatorSet(); mContentAnim = new AnimatorSet();
mContentAnim mContentAnim
.play(ObjectAnimator.ofFloat(mContentParent, "alpha", mContentParent.getAlpha(), .play(ObjectAnimator.ofFloat(mContentParent, "alpha",
appearing ? 1.0f : 0.0f)) mContentParent.getAlpha(), appearing ? 1.0f : 0.0f))
.with(glowAnim)
.with(bgAnim) .with(bgAnim)
.with(glowAnim)
.with(posAnim) .with(posAnim)
; ;
mContentAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION); mContentAnim.setDuration((DEBUG?10:1)*(appearing ? OPEN_DURATION : CLOSE_DURATION));
mContentAnim.addListener(this); mContentAnim.addListener(this);
} }
@@ -250,13 +251,13 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
createAnimation(appearing); createAnimation(appearing);
mContentParent.setLayerType(View.LAYER_TYPE_HARDWARE, null); mContentParent.setLayerType(View.LAYER_TYPE_HARDWARE, null);
mGlow.setLayerType(View.LAYER_TYPE_HARDWARE, null);
mContentAnim.start(); mContentAnim.start();
mVisible = appearing; mVisible = appearing;
} }
void jumpTo(boolean appearing) { void jumpTo(boolean appearing) {
// setBgAlpha(appearing ? 255 : 0);
mContentParent.setTranslationY(appearing ? 0 : mPanelHeight); mContentParent.setTranslationY(appearing ? 0 : mPanelHeight);
} }
@@ -286,6 +287,7 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
setVisibility(View.GONE); setVisibility(View.GONE);
} }
mContentParent.setLayerType(View.LAYER_TYPE_NONE, null); mContentParent.setLayerType(View.LAYER_TYPE_NONE, null);
mGlow.setLayerType(View.LAYER_TYPE_NONE, null);
mContentAnim = null; mContentAnim = null;
} }

View File

@@ -189,7 +189,7 @@ public class TabletStatusBar extends StatusBar implements
mStatusBarView.setIgnoreChildren(0, mNotificationTrigger, mNotificationPanel); mStatusBarView.setIgnoreChildren(0, mNotificationTrigger, mNotificationPanel);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams( WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
720, // ViewGroup.LayoutParams.MATCH_PARENT, 512, // ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN