summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornebkat <nebkat@teamhacksung.org>2012-01-23 18:25:49 +0000
committernebkat <nebkat@teamhacksung.org>2012-01-23 18:40:09 +0000
commit535b875b47380ed50a8d3f7f060aeb7ae7784b4b (patch)
treeb89dc821971034b8c8843cd9c2abc360ccf4d78d
parent106e8752b40c35a2df333a3f0454de012149309d (diff)
downloadandroid_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.xml22
-rw-r--r--res/values/config.xml2
-rw-r--r--res/values/strings.xml5
-rw-r--r--res/xml/preferences.xml11
-rw-r--r--src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java272
-rw-r--r--src/com/cyanogenmod/trebuchet/Workspace.java2
-rw-r--r--src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java18
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);