OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.chrome.browser.compositor.layouts.phone.stack; |
| 6 |
| 7 import static org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Ani
matableAnimation.addAnimation; |
| 8 import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTa
b.Property.MAX_CONTENT_HEIGHT; |
| 9 import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTa
b.Property.SATURATION; |
| 10 import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTa
b.Property.SIDE_BORDER_SCALE; |
| 11 import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTa
b.Property.TILTY; |
| 12 import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTa
b.Property.TOOLBAR_ALPHA; |
| 13 import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTa
b.Property.TOOLBAR_Y_OFFSET; |
| 14 import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTa
b.Property.DISCARD_AMOUNT; |
| 15 import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTa
b.Property.SCALE; |
| 16 import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTa
b.Property.SCROLL_OFFSET; |
| 17 import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTa
b.Property.X_IN_STACK_INFLUENCE; |
| 18 import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTa
b.Property.X_IN_STACK_OFFSET; |
| 19 import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTa
b.Property.Y_IN_STACK_INFLUENCE; |
| 20 |
| 21 import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation; |
| 22 import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable
; |
| 23 import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; |
| 24 import org.chromium.chrome.browser.util.MathUtils; |
| 25 import org.chromium.ui.base.LocalizationUtils; |
| 26 |
| 27 class StackAnimationLandscape extends StackAnimation { |
| 28 /** |
| 29 * Only Constructor. |
| 30 */ |
| 31 public StackAnimationLandscape(float width, float height, float heightMinusT
opControls, |
| 32 float borderFramePaddingTop, float borderFramePaddingTopOpaque, |
| 33 float borderFramePaddingLeft) { |
| 34 super(width, height, heightMinusTopControls, borderFramePaddingTop, |
| 35 borderFramePaddingTopOpaque, borderFramePaddingLeft); |
| 36 } |
| 37 |
| 38 @Override |
| 39 protected ChromeAnimation<?> createEnterStackAnimatorSet( |
| 40 StackTab[] tabs, int focusIndex, int spacing, float warpSize) { |
| 41 ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(
); |
| 42 final float initialScrollOffset = StackTab.screenToScroll(0, warpSize); |
| 43 |
| 44 for (int i = 0; i < tabs.length; ++i) { |
| 45 StackTab tab = tabs[i]; |
| 46 |
| 47 tab.resetOffset(); |
| 48 tab.setScale(SCALE_AMOUNT); |
| 49 tab.setAlpha(1.f); |
| 50 tab.getLayoutTab().setToolbarAlpha(0.f); |
| 51 tab.getLayoutTab().setBorderScale(1.f); |
| 52 |
| 53 final float scrollOffset = StackTab.screenToScroll(i * spacing, warp
Size); |
| 54 |
| 55 addAnimation(set, tab.getLayoutTab(), MAX_CONTENT_HEIGHT, |
| 56 tab.getLayoutTab().getUnclampedOriginalContentHeight(), mHei
ghtMinusTopControls, |
| 57 ENTER_STACK_ANIMATION_DURATION, 0); |
| 58 if (i < focusIndex) { |
| 59 addAnimation(set, tab, SCROLL_OFFSET, initialScrollOffset, scrol
lOffset, |
| 60 ENTER_STACK_ANIMATION_DURATION, 0); |
| 61 } else if (i > focusIndex) { |
| 62 tab.setScrollOffset(scrollOffset); |
| 63 addAnimation(set, tab, X_IN_STACK_OFFSET, |
| 64 (mWidth > mHeight && LocalizationUtils.isLayoutRtl()) ?
-mWidth : mWidth, |
| 65 0.0f, ENTER_STACK_ANIMATION_DURATION, 0); |
| 66 } else { |
| 67 tab.setScrollOffset(scrollOffset); |
| 68 addAnimation(set, tab, X_IN_STACK_INFLUENCE, 0.0f, 1.0f, |
| 69 ENTER_STACK_BORDER_ALPHA_DURATION, 0); |
| 70 addAnimation( |
| 71 set, tab, SCALE, 1.0f, SCALE_AMOUNT, ENTER_STACK_BORDER_
ALPHA_DURATION, 0); |
| 72 addAnimation(set, tab.getLayoutTab(), TOOLBAR_ALPHA, 1.f, 0.f, |
| 73 ENTER_STACK_TOOLBAR_ALPHA_DURATION, ENTER_STACK_TOOLBAR_
ALPHA_DELAY); |
| 74 addAnimation(set, tab.getLayoutTab(), TOOLBAR_Y_OFFSET, 0.f, |
| 75 getToolbarOffsetToLineUpWithBorder(), ENTER_STACK_BORDER
_ALPHA_DURATION, |
| 76 TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); |
| 77 addAnimation(set, tab.getLayoutTab(), SIDE_BORDER_SCALE, 0.f, 1.
f, |
| 78 ENTER_STACK_BORDER_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_A
LPHA_DELAY); |
| 79 } |
| 80 } |
| 81 |
| 82 return set; |
| 83 } |
| 84 |
| 85 @Override |
| 86 protected ChromeAnimation<?> createTabFocusedAnimatorSet( |
| 87 StackTab[] tabs, int focusIndex, int spacing, float warpSize) { |
| 88 ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(
); |
| 89 for (int i = 0; i < tabs.length; ++i) { |
| 90 StackTab tab = tabs[i]; |
| 91 LayoutTab layoutTab = tab.getLayoutTab(); |
| 92 |
| 93 addTiltScrollAnimation(set, layoutTab, 0.0f, TAB_FOCUSED_ANIMATION_D
URATION, 0); |
| 94 addAnimation(set, tab, DISCARD_AMOUNT, tab.getDiscardAmount(), 0.0f, |
| 95 TAB_FOCUSED_ANIMATION_DURATION, 0); |
| 96 |
| 97 if (i < focusIndex) { |
| 98 // For tabs left of the focused tab move them left to 0. |
| 99 addAnimation(set, tab, SCROLL_OFFSET, tab.getScrollOffset(), |
| 100 Math.max(0.0f, tab.getScrollOffset() - mWidth - spacing)
, |
| 101 TAB_FOCUSED_ANIMATION_DURATION, 0); |
| 102 } else if (i > focusIndex) { |
| 103 // We also need to animate the X Translation to move them right |
| 104 // off the screen. |
| 105 float coveringTabPosition = layoutTab.getX(); |
| 106 float distanceToBorder = LocalizationUtils.isLayoutRtl() |
| 107 ? coveringTabPosition + layoutTab.getScaledContentWidth(
) |
| 108 : mWidth - coveringTabPosition; |
| 109 float clampedDistanceToBorder = MathUtils.clamp(distanceToBorder
, 0, mWidth); |
| 110 float delay = TAB_FOCUSED_MAX_DELAY * clampedDistanceToBorder /
mWidth; |
| 111 addAnimation(set, tab, X_IN_STACK_OFFSET, tab.getXInStackOffset(
), |
| 112 tab.getXInStackOffset() |
| 113 + (LocalizationUtils.isLayoutRtl() ? -mWidth : m
Width), |
| 114 (TAB_FOCUSED_ANIMATION_DURATION - (long) delay), (long)
delay); |
| 115 } else { |
| 116 // This is the focused tab. We need to scale it back to |
| 117 // 1.0f, move it to the top of the screen, and animate the |
| 118 // X Translation so that it looks like it is zooming into the |
| 119 // full screen view. We move the card to the top left and exten
d it out so |
| 120 // it becomes a full card. |
| 121 tab.setXOutOfStack(0); |
| 122 tab.setYOutOfStack(0.0f); |
| 123 layoutTab.setBorderScale(1.f); |
| 124 |
| 125 addAnimation(set, tab, SCROLL_OFFSET, tab.getScrollOffset(), |
| 126 StackTab.screenToScroll(0, warpSize), TAB_FOCUSED_ANIMAT
ION_DURATION, 0); |
| 127 addAnimation( |
| 128 set, tab, SCALE, tab.getScale(), 1.0f, TAB_FOCUSED_ANIMA
TION_DURATION, 0); |
| 129 addAnimation(set, tab, X_IN_STACK_INFLUENCE, tab.getXInStackInfl
uence(), 0.0f, |
| 130 TAB_FOCUSED_ANIMATION_DURATION, 0); |
| 131 addAnimation(set, tab, Y_IN_STACK_INFLUENCE, tab.getYInStackInfl
uence(), 0.0f, |
| 132 TAB_FOCUSED_Y_STACK_DURATION, 0); |
| 133 |
| 134 addAnimation(set, tab.getLayoutTab(), MAX_CONTENT_HEIGHT, |
| 135 tab.getLayoutTab().getMaxContentHeight(), |
| 136 tab.getLayoutTab().getUnclampedOriginalContentHeight(), |
| 137 TAB_FOCUSED_ANIMATION_DURATION, 0); |
| 138 tab.setYOutOfStack(mHeight - mHeightMinusTopControls - mBorderTo
pHeight); |
| 139 |
| 140 if (layoutTab.shouldStall()) { |
| 141 addAnimation(set, layoutTab, SATURATION, 1.0f, 0.0f, |
| 142 TAB_FOCUSED_BORDER_ALPHA_DURATION, TAB_FOCUSED_BORDE
R_ALPHA_DELAY); |
| 143 } |
| 144 addAnimation(set, tab.getLayoutTab(), TOOLBAR_ALPHA, layoutTab.g
etToolbarAlpha(), |
| 145 1.f, TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOO
LBAR_ALPHA_DELAY); |
| 146 addAnimation(set, tab.getLayoutTab(), TOOLBAR_Y_OFFSET, |
| 147 getToolbarOffsetToLineUpWithBorder(), 0.f, |
| 148 TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_
ALPHA_DELAY); |
| 149 addAnimation(set, tab.getLayoutTab(), SIDE_BORDER_SCALE, 1.f, 0.
f, |
| 150 TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_
ALPHA_DELAY); |
| 151 } |
| 152 } |
| 153 |
| 154 return set; |
| 155 } |
| 156 |
| 157 @Override |
| 158 protected ChromeAnimation<?> createViewMoreAnimatorSet(StackTab[] tabs, int
selectedIndex) { |
| 159 ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(
); |
| 160 |
| 161 if (selectedIndex + 1 >= tabs.length) return set; |
| 162 |
| 163 float offset = tabs[selectedIndex].getScrollOffset() |
| 164 - tabs[selectedIndex + 1].getScrollOffset() |
| 165 + (tabs[selectedIndex].getLayoutTab().getScaledContentWidth() |
| 166 * VIEW_MORE_SIZE_RATIO); |
| 167 offset = Math.max(VIEW_MORE_MIN_SIZE, offset); |
| 168 for (int i = selectedIndex + 1; i < tabs.length; ++i) { |
| 169 addAnimation(set, tabs[i], SCROLL_OFFSET, tabs[i].getScrollOffset(), |
| 170 tabs[i].getScrollOffset() + offset, VIEW_MORE_ANIMATION_DURA
TION, 0); |
| 171 } |
| 172 |
| 173 return set; |
| 174 } |
| 175 |
| 176 @Override |
| 177 protected ChromeAnimation<?> createReachTopAnimatorSet(StackTab[] tabs, floa
t warpSize) { |
| 178 ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(
); |
| 179 |
| 180 float screenTarget = 0.0f; |
| 181 for (int i = 0; i < tabs.length; ++i) { |
| 182 if (screenTarget >= tabs[i].getLayoutTab().getX()) { |
| 183 break; |
| 184 } |
| 185 addAnimation(set, tabs[i], SCROLL_OFFSET, tabs[i].getScrollOffset(), |
| 186 StackTab.screenToScroll(screenTarget, warpSize), REACH_TOP_A
NIMATION_DURATION, |
| 187 0); |
| 188 screenTarget += tabs[i].getLayoutTab().getScaledContentWidth(); |
| 189 } |
| 190 |
| 191 return set; |
| 192 } |
| 193 |
| 194 @Override |
| 195 protected boolean isDefaultDiscardDirectionPositive() { |
| 196 return true; |
| 197 } |
| 198 |
| 199 @Override |
| 200 protected float getScreenPositionInScrollDirection(StackTab tab) { |
| 201 return tab.getLayoutTab().getX(); |
| 202 } |
| 203 |
| 204 @Override |
| 205 protected void addTiltScrollAnimation(ChromeAnimation<Animatable<?>> set, La
youtTab tab, |
| 206 float end, int duration, int startTime) { |
| 207 addAnimation(set, tab, TILTY, tab.getTiltY(), end, duration, startTime); |
| 208 } |
| 209 |
| 210 @Override |
| 211 protected float getScreenSizeInScrollDirection() { |
| 212 return mWidth; |
| 213 } |
| 214 |
| 215 @Override |
| 216 protected int getTabCreationDirection() { |
| 217 return 1; |
| 218 } |
| 219 } |
OLD | NEW |