diff options
author | nebkat <nebkat@teamhacksung.org> | 2012-01-23 18:25:49 +0000 |
---|---|---|
committer | nebkat <nebkat@teamhacksung.org> | 2012-01-23 18:40:09 +0000 |
commit | 535b875b47380ed50a8d3f7f060aeb7ae7784b4b (patch) | |
tree | b89dc821971034b8c8843cd9c2abc360ccf4d78d | |
parent | 106e8752b40c35a2df333a3f0454de012149309d (diff) | |
download | android_packages_apps_Trebuchet-535b875b47380ed50a8d3f7f060aeb7ae7784b4b.tar.gz android_packages_apps_Trebuchet-535b875b47380ed50a8d3f7f060aeb7ae7784b4b.tar.bz2 android_packages_apps_Trebuchet-535b875b47380ed50a8d3f7f060aeb7ae7784b4b.zip |
Preferences: TransitionEffect (AppsCustomize)
Change-Id: I8b6371c2bbed1323e92864009a7ef9de90029540
-rw-r--r-- | res/values/arrays.xml | 22 | ||||
-rw-r--r-- | res/values/config.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 5 | ||||
-rw-r--r-- | res/xml/preferences.xml | 11 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java | 272 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/Workspace.java | 2 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java | 18 |
7 files changed, 272 insertions, 60 deletions
diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 8d5547787..472ff312b 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -40,4 +40,26 @@ <item>CubeOut</item> <item>Stack</item> </string-array> + <string-array name="preferences_interface_drawer_scrolling_transition_effect_entries"> + <item>Standard</item> + <item>Tablet</item> + <item>Zoom In</item> + <item>Zoom Out</item> + <item>Rotate Up</item> + <item>Rotate Down</item> + <item>Cube In</item> + <item>Cube Out</item> + <item>Stack</item> + </string-array> + <string-array name="preferences_interface_drawer_scrolling_transition_effect_values"> + <item>Standard</item> + <item>Tablet</item> + <item>ZoomIn</item> + <item>ZoomOut</item> + <item>RotateUp</item> + <item>RotateDown</item> + <item>CubeIn</item> + <item>CubeOut</item> + <item>Stack</item> + </string-array> </resources> diff --git a/res/values/config.xml b/res/values/config.xml index 58aad255e..8af0779f6 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -6,6 +6,8 @@ <bool name="config_cyanogenmod">false</bool> <!-- AllApps/Customize/AppsCustomize --> + <!-- Which default transition effect to use on the AppsCustomize --> + <string name="config_drawerDefaultTransitionEffect">Stack</string> <!-- The alpha of the AppsCustomize bg in spring loaded mode --> <integer name="config_appsCustomizeSpringLoadedBgAlpha">45</integer> <!-- Fade in/out duration of icons being dragged from the trays --> diff --git a/res/values/strings.xml b/res/values/strings.xml index 933953e5a..7d873a628 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -313,6 +313,11 @@ s --> <string name="preferences_interface_drawer_widgets_category">Widgets</string> <string name="preferences_interface_drawer_widgets_join_apps_title">Join with Apps</string> <string name="preferences_interface_drawer_widgets_join_apps_summary">Swipe from apps drawer to widgets drawer without changing tabs</string> + <string name="preferences_interface_drawer_scrolling_category">Scrolling</string> + <string name="preferences_interface_drawer_scrolling_transition_effect_title">Transition Effect</string> + <string name="preferences_interface_drawer_scrolling_transition_effect_summary">Scrolling effect when scrolling screens</string> + <string name="preferences_interface_drawer_scrolling_fade_adjacent_screens_title">Fade Side Pages</string> + <string name="preferences_interface_drawer_scrolling_fade_adjacent_screens_summary">Fade the side pages when scrolling screens</string> <string name="preferences_interface_drawer_indicator_category">Indicator</string> <string name="preferences_interface_drawer_indicator_enable_title">Show Page Indicator</string> <string name="preferences_interface_drawer_indicator_enable_summary">Show current page indicator at the bottom of the screen</string> diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index fbdf2dcde..ef3ee5c29 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -85,6 +85,17 @@ android:summary="@string/preferences_interface_drawer_widgets_join_apps_summary" android:defaultValue="true" /> </PreferenceCategory> + <PreferenceCategory android:title="@string/preferences_interface_drawer_scrolling_category"> + <ListPreference android:key="ui_drawer_scrolling_transition_effect" + android:title="@string/preferences_interface_drawer_scrolling_transition_effect_title" + android:summary="@string/preferences_interface_drawer_scrolling_transition_effect_summary" + android:entries="@array/preferences_interface_drawer_scrolling_transition_effect_entries" + android:entryValues="@array/preferences_interface_drawer_scrolling_transition_effect_values" + android:defaultValue="@string/config_drawerDefaultTransitionEffect" /> + <CheckBoxPreference android:key="ui_drawer_scrolling_fade_adjacent_screens" + android:title="@string/preferences_interface_drawer_scrolling_fade_adjacent_screens_title" + android:summary="@string/preferences_interface_drawer_scrolling_fade_adjacent_screens_summary" /> + </PreferenceCategory> <PreferenceCategory android:title="@string/preferences_interface_drawer_indicator_category"> <CheckBoxPreference android:key="ui_drawer_indicator_enable" android:title="@string/preferences_interface_drawer_indicator_enable_title" diff --git a/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java b/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java index efee2c4d0..27282f551 100644 --- a/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java +++ b/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java @@ -219,13 +219,28 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen // Relating to the scroll and overscroll effects Workspace.ZInterpolator mZInterpolator = new Workspace.ZInterpolator(0.5f); - private static float CAMERA_DISTANCE = 6500; - private static float TRANSITION_SCALE_FACTOR = 0.74f; - private static float TRANSITION_PIVOT = 0.65f; - private static float TRANSITION_MAX_ROTATION = 22; + private static final float CAMERA_DISTANCE = 6500; + private static final float TRANSITION_SCALE_FACTOR = 0.74f; + private static final float TRANSITION_PIVOT = 0.65f; + private static final float TRANSITION_MAX_ROTATION = 22; + private static final float TRANSITION_SCREEN_ROTATION = 12.5f; private static final boolean PERFORM_OVERSCROLL_ROTATION = true; + private boolean mOverscrollTransformsDirty = false; private AccelerateInterpolator mAlphaInterpolator = new AccelerateInterpolator(0.9f); private DecelerateInterpolator mLeftScreenAlphaInterpolator = new DecelerateInterpolator(4); + public enum TransitionEffect { + Standard, + Tablet, + ZoomIn, + ZoomOut, + RotateUp, + RotateDown, + CubeIn, + CubeOut, + Stack + } + private TransitionEffect mTransitionEffect; + // Previews & outlines ArrayList<AppsCustomizeAsyncTask> mRunningTasks; @@ -249,15 +264,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen mCanvas = new Canvas(); mRunningTasks = new ArrayList<AppsCustomizeAsyncTask>(); - // Preferences - mJoinWidgetsApps = PreferencesProvider.Interface.Drawer.getJoinWidgetsApps(context); - mShowScrollingIndicator = PreferencesProvider.Interface.Drawer.Indicator.getShowScrollingIndicator(context); - mFadeScrollingIndicator = PreferencesProvider.Interface.Drawer.Indicator.getFadeScrollingIndicator(context); - - if (!mShowScrollingIndicator) { - disableScrollingIndicator(); - } - // Save the default widget preview background Resources resources = context.getResources(); mDefaultWidgetBackground = resources.getDrawable(R.drawable.default_widget_preview_holo); @@ -285,7 +291,19 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen // (top + bottom) mWidgetPreviewIconPaddedDimension = (int) (mAppIconSize * (1 + (2 * sWidgetPreviewIconPaddingPercentage))); - mFadeInAdjacentScreens = false; + mHandleFadeInAdjacentScreens = true; + + // Preferences + mJoinWidgetsApps = PreferencesProvider.Interface.Drawer.getJoinWidgetsApps(context); + mTransitionEffect = PreferencesProvider.Interface.Drawer.Scrolling.getTransitionEffect(context, + resources.getString(R.string.config_drawerDefaultTransitionEffect)); + mFadeInAdjacentScreens = PreferencesProvider.Interface.Drawer.Scrolling.getFadeInAdjacentScreens(context); + mShowScrollingIndicator = PreferencesProvider.Interface.Drawer.Indicator.getShowScrollingIndicator(context); + mFadeScrollingIndicator = PreferencesProvider.Interface.Drawer.Indicator.getFadeScrollingIndicator(context); + + if (!mShowScrollingIndicator) { + disableScrollingIndicator(); + } } @Override @@ -943,8 +961,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen layout.setMinimumWidth(getPageContentWidth()); layout.measure(widthSpec, heightSpec); setVisibilityOnChildren(layout, View.VISIBLE); - - layout.setCameraDistance(mDensity * CAMERA_DISTANCE); } public void syncAppsPages() { // Ensure that we have the right number of pages @@ -1550,22 +1566,125 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen return getChildCount() - index - 1; } - // Transition effects - @Override - protected void screenScrolled(int screenScroll) { - super.screenScrolled(screenScroll); + private void screenScrolledStandard(int screenScroll) { + for (int i = 0; i < getChildCount(); i++) { + View v = getPageAt(i); + if (v != null) { + float scrollProgress = getScrollProgress(screenScroll, v, i); + if (mFadeInAdjacentScreens) { + float alpha = 1 - Math.abs(scrollProgress); + v.setFastAlpha(alpha); + v.fastInvalidate(); + } + } + } + } + + private void screenScrolledTablet(int screenScroll) { + for (int i = 0; i < getChildCount(); i++) { + View v = getPageAt(i); + if (v != null) { + float scrollProgress = getScrollProgress(screenScroll, v, i); + float rotation = TRANSITION_SCREEN_ROTATION * scrollProgress; + float translationX = mLauncher.getWorkspace().getOffsetXForRotation(rotation, v.getWidth(), v.getHeight()); + + v.setFastTranslationX(translationX); + v.setFastRotationY(rotation); + if (mFadeInAdjacentScreens) { + float alpha = 1 - Math.abs(scrollProgress); + v.setFastAlpha(alpha); + } + v.fastInvalidate(); + } + } + invalidate(); + } + + private void screenScrolledZoom(int screenScroll, boolean in) { + for (int i = 0; i < getChildCount(); i++) { + View v = getPageAt(i); + if (v != null) { + float scrollProgress = getScrollProgress(screenScroll, v, i); + float scale = 1.0f + (in ? -0.2f : 0.1f) * Math.abs(scrollProgress); + + // Extra translation to account for the increase in size + if (!in) { + float translationX = v.getMeasuredWidth() * 0.1f * -scrollProgress; + v.setFastTranslationX(translationX); + } + + v.setFastScaleX(scale); + v.setFastScaleY(scale); + if (mFadeInAdjacentScreens) { + float alpha = 1 - Math.abs(scrollProgress); + v.setFastAlpha(alpha); + } + v.fastInvalidate(); + } + } + } + private void screenScrolledRotate(int screenScroll, boolean up) { for (int i = 0; i < getChildCount(); i++) { View v = getPageAt(i); if (v != null) { float scrollProgress = getScrollProgress(screenScroll, v, i); + float rotation = + (up ? TRANSITION_SCREEN_ROTATION : -TRANSITION_SCREEN_ROTATION) * scrollProgress; + float translationX = v.getMeasuredWidth() * scrollProgress; + + float rotatePoint = + (v.getMeasuredWidth() * 0.5f) / + (float) Math.tan(Math.toRadians((double) (TRANSITION_SCREEN_ROTATION * 0.5f))); + + v.setPivotX(v.getMeasuredWidth() * 0.5f); + if (up) { + v.setPivotY(-rotatePoint); + } else { + v.setPivotY(v.getMeasuredHeight() + rotatePoint); + } + + v.setRotation(rotation); + v.setFastTranslationX(translationX); + if (mFadeInAdjacentScreens) { + float alpha = 1 - Math.abs(scrollProgress); + v.setFastAlpha(alpha); + } + v.fastInvalidate(); + } + } + } + private void screenScrolledCube(int screenScroll, boolean in) { + for (int i = 0; i < getChildCount(); i++) { + View v = getPageAt(i); + if (v != null) { + float scrollProgress = getScrollProgress(screenScroll, v, i); + float rotation = (in ? 90.0f : -90.0f) * scrollProgress; + float alpha = 1 - Math.abs(scrollProgress); + + if (in) { + v.setCameraDistance(mDensity * CAMERA_DISTANCE); + } + + v.setPivotX(scrollProgress < 0 ? 0 : v.getMeasuredWidth()); + v.setPivotY(v.getMeasuredHeight() * 0.5f); + v.setRotationY(rotation); + v.setFastAlpha(alpha); + v.fastInvalidate(); + } + } + } + + private void screenScrolledStack(int screenScroll) { + for (int i = 0; i < getChildCount(); i++) { + View v = getPageAt(i); + if (v != null) { + float scrollProgress = getScrollProgress(screenScroll, v, i); float interpolatedProgress = mZInterpolator.getInterpolation(Math.abs(Math.min(scrollProgress, 0))); - float scale = (1 - interpolatedProgress) + - interpolatedProgress * TRANSITION_SCALE_FACTOR; + float scale = (1 - interpolatedProgress) + interpolatedProgress * 0.76f; float translationX = Math.min(0, scrollProgress) * v.getMeasuredWidth(); - float alpha; if (!LauncherApplication.isScreenLarge() || scrollProgress < 0) { @@ -1576,46 +1695,87 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen alpha = mLeftScreenAlphaInterpolator.getInterpolation(1 - scrollProgress); } - v.setCameraDistance(mDensity * CAMERA_DISTANCE); - int pageWidth = v.getMeasuredWidth(); - int pageHeight = v.getMeasuredHeight(); - - if (PERFORM_OVERSCROLL_ROTATION) { - if (i == 0 && scrollProgress < 0) { - // Overscroll to the left - v.setPivotX(TRANSITION_PIVOT * pageWidth); - v.setRotationY(-TRANSITION_MAX_ROTATION * scrollProgress); - scale = 1.0f; - alpha = 1.0f; - // On the first page, we don't want the page to have any lateral motion - translationX = 0; - } else if (i == getChildCount() - 1 && scrollProgress > 0) { - // Overscroll to the right - v.setPivotX((1 - TRANSITION_PIVOT) * pageWidth); - v.setRotationY(-TRANSITION_MAX_ROTATION * scrollProgress); - scale = 1.0f; - alpha = 1.0f; - // On the last page, we don't want the page to have any lateral motion. - translationX = 0; - } else { - v.setPivotY(pageHeight / 2.0f); - v.setPivotX(pageWidth / 2.0f); - v.setRotationY(0f); - } - } - - v.setTranslationX(translationX); - v.setScaleX(scale); - v.setScaleY(scale); - v.setAlpha(alpha); + v.setFastTranslationX(translationX); + v.setFastScaleX(scale); + v.setFastScaleY(scale); + v.setFastAlpha(alpha); // If the view has 0 alpha, we set it to be invisible so as to prevent // it from accepting touches - if (alpha < ViewConfiguration.ALPHA_THRESHOLD) { + if (alpha <= 0) { v.setVisibility(INVISIBLE); } else if (v.getVisibility() != VISIBLE) { v.setVisibility(VISIBLE); } + v.fastInvalidate(); + } + } + invalidate(); + } + + // Transition effects + @Override + protected void screenScrolled(int screenScroll) { + super.screenScrolled(screenScroll); + + if (mOverScrollX < 0 || mOverScrollX > mMaxScrollX) { + int index = mOverScrollX < 0 ? 0 : getChildCount() - 1; + View v = getPageAt(index); + if (v != null) { + float scrollProgress = getScrollProgress(screenScroll, v, index); + float rotation = - TRANSITION_MAX_ROTATION * scrollProgress; + v.setCameraDistance(mDensity * CAMERA_DISTANCE); + v.setPivotX(v.getMeasuredWidth() * (index == 0 ? TRANSITION_PIVOT : 1 - TRANSITION_PIVOT)); + v.setPivotY(v.getMeasuredHeight() * 0.5f); + v.setRotationY(rotation); + v.setTranslationX(0.0f); + mOverscrollTransformsDirty = true; + } + } else { + // Reset transforms when we aren't in overscroll + if (mOverscrollTransformsDirty) { + mOverscrollTransformsDirty = false; + View v0 = getPageAt(0); + View v1 = getPageAt(getChildCount() - 1); + v0.setTranslationX(0); + v1.setTranslationX(0); + v0.setRotationY(0); + v1.setRotationY(0); + v0.setCameraDistance(mDensity * 1280); + v1.setCameraDistance(mDensity * 1280); + v0.setPivotX(v0.getMeasuredWidth() / 2); + v1.setPivotX(v1.getMeasuredWidth() / 2); + v0.setPivotY(v0.getMeasuredHeight() / 2); + v1.setPivotY(v1.getMeasuredHeight() / 2); + } + switch (mTransitionEffect) { + case Standard: + screenScrolledStandard(screenScroll); + break; + case Tablet: + screenScrolledTablet(screenScroll); + break; + case ZoomIn: + screenScrolledZoom(screenScroll, true); + break; + case ZoomOut: + screenScrolledZoom(screenScroll, false); + break; + case RotateUp: + screenScrolledRotate(screenScroll, true); + break; + case RotateDown: + screenScrolledRotate(screenScroll, false); + break; + case CubeIn: + screenScrolledCube(screenScroll, true); + break; + case CubeOut: + screenScrolledCube(screenScroll, false); + break; + case Stack: + screenScrolledStack(screenScroll); + break; } } } diff --git a/src/com/cyanogenmod/trebuchet/Workspace.java b/src/com/cyanogenmod/trebuchet/Workspace.java index 5d56cad4d..ea4b055d1 100644 --- a/src/com/cyanogenmod/trebuchet/Workspace.java +++ b/src/com/cyanogenmod/trebuchet/Workspace.java @@ -1194,7 +1194,7 @@ public class Workspace extends PagedView * @param height Height of the view * @return Offset to be used in a View.setTranslationX() call */ - private float getOffsetXForRotation(float degrees, int width, int height) { + protected float getOffsetXForRotation(float degrees, int width, int height) { mMatrix.reset(); mCamera.save(); mCamera.rotateY(Math.abs(degrees)); diff --git a/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java b/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java index e8d62ec67..4e9c03a83 100644 --- a/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java +++ b/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java @@ -19,7 +19,8 @@ package com.cyanogenmod.trebuchet.preference; import android.content.Context; import android.content.SharedPreferences; -import static com.cyanogenmod.trebuchet.Workspace.TransitionEffect; +import com.cyanogenmod.trebuchet.Workspace; +import com.cyanogenmod.trebuchet.AppsCustomizePagedView; public final class PreferencesProvider { public static final String PREFERENCES_KEY = "com.cyanogenmod.trebuchet_preferences"; @@ -49,9 +50,9 @@ public final class PreferencesProvider { final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0); return preferences.getBoolean("ui_homescreen_scrolling_scroll_wallpaper", true); } - public static TransitionEffect getTransitionEffect(Context context, String def) { + public static Workspace.TransitionEffect getTransitionEffect(Context context, String def) { final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0); - return TransitionEffect.valueOf( + return Workspace.TransitionEffect.valueOf( preferences.getString("ui_homescreen_scrolling_transition_effect", def)); } public static boolean getFadeInAdjacentScreens(Context context, boolean def) { @@ -80,6 +81,17 @@ public final class PreferencesProvider { final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0); return preferences.getBoolean("ui_drawer_widgets_join_apps", true); } + public static class Scrolling { + public static AppsCustomizePagedView.TransitionEffect getTransitionEffect(Context context, String def) { + final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0); + return AppsCustomizePagedView.TransitionEffect.valueOf( + preferences.getString("ui_drawer_scrolling_transition_effect", def)); + } + public static boolean getFadeInAdjacentScreens(Context context) { + final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0); + return preferences.getBoolean("ui_drawer_scrolling_fade_adjacent_screens", false); + } + } public static class Indicator { public static boolean getShowScrollingIndicator(Context context) { final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0); |