diff options
author | Clark Scheff <clark@cyngn.com> | 2014-07-15 19:56:35 -0700 |
---|---|---|
committer | Clark Scheff <clark@cyngn.com> | 2014-07-16 09:48:01 -0700 |
commit | 59a1467e4360bbe63a936d568654fcd84cb1c720 (patch) | |
tree | 0957494e649be734d6b9e87ce04fd7fb21eee1ab /src/org/cyanogenmod | |
parent | b8cdd6817c45ecd077496f036453012d403d68f5 (diff) | |
download | packages_apps_ThemeChooser-59a1467e4360bbe63a936d568654fcd84cb1c720.zip packages_apps_ThemeChooser-59a1467e4360bbe63a936d568654fcd84cb1c720.tar.gz packages_apps_ThemeChooser-59a1467e4360bbe63a936d568654fcd84cb1c720.tar.bz2 |
Animate component changes for status bar, nav bar and fonts
Change-Id: Ia0cd72869c3e4524e1306a00fe6f81c76b45b3a6
Diffstat (limited to 'src/org/cyanogenmod')
-rw-r--r-- | src/org/cyanogenmod/theme/chooserv2/ComponentCardView.java | 61 | ||||
-rw-r--r-- | src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java | 50 |
2 files changed, 101 insertions, 10 deletions
diff --git a/src/org/cyanogenmod/theme/chooserv2/ComponentCardView.java b/src/org/cyanogenmod/theme/chooserv2/ComponentCardView.java index a20f032..0dc3387 100644 --- a/src/org/cyanogenmod/theme/chooserv2/ComponentCardView.java +++ b/src/org/cyanogenmod/theme/chooserv2/ComponentCardView.java @@ -1,15 +1,18 @@ package org.cyanogenmod.theme.chooserv2; +import android.animation.Animator; +import android.animation.AnimatorSet; import android.animation.IntEvaluator; +import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.graphics.drawable.NinePatchDrawable; import android.graphics.drawable.TransitionDrawable; import android.util.AttributeSet; import android.view.View; +import android.view.ViewOverlay; import android.widget.LinearLayout; import android.widget.TextView; @@ -135,4 +138,60 @@ public class ComponentCardView extends LinearLayout { }); bgAlphaAnimator.start(); } + + /** + * Animates a change in the content of the card + * @param v View in card to animate + * @param overlay Drawable to animate as a ViewOverlay + * @param duration Duration of animation + */ + public void animateContentChange(View v, final Drawable overlay, long duration) { + final ViewOverlay viewOverlay = this.getOverlay(); + viewOverlay.add(overlay); + final int x = (int) v.getX(); + final int y = (int) v.getY(); + final int width = v.getWidth(); + final int height = v.getHeight(); + overlay.setBounds(x, y, x + v.getWidth(), y + v.getHeight()); + + final ValueAnimator overlayAnimator = ValueAnimator.ofFloat(1f, 0f); + overlayAnimator.setDuration(duration); + overlayAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + float value = (Float) animation.getAnimatedValue(); + overlay.setAlpha((int) (255 * value)); + int newWidth = (int) (value * width); + int newHeight = (int) (value * height); + int dw = (width - newWidth) / 2; + int dh = (height - newHeight) / 2; + overlay.setBounds(x + dw, y + dh, x + dw + newWidth, y + dh + newHeight); + } + }); + overlayAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) {} + + @Override + public void onAnimationEnd(Animator animation) { + // Clear out the ViewOverlay now that we are done animating + viewOverlay.clear(); + } + + @Override + public void onAnimationCancel(Animator animation) {} + + @Override + public void onAnimationRepeat(Animator animation) {} + }); + + AnimatorSet set = new AnimatorSet(); + set.play(ObjectAnimator.ofFloat(v, "alpha", 0f, 1f)) + .with(ObjectAnimator.ofFloat(v, "scaleX", 0f, 1f)) + .with(ObjectAnimator.ofFloat(v, "scaleY", 0f, 1f)); + set.setDuration(duration); + + set.start(); + overlayAnimator.start(); + } } diff --git a/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java b/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java index 09df7ea..26fad1b 100644 --- a/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java +++ b/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java @@ -689,17 +689,17 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb switch (loader.getId()) { case LOADER_ID_ALL: loadWallpaper(c); - loadStatusBar(c); + loadStatusBar(c, false); loadIcons(c, false); - loadNavBar(c); + loadNavBar(c, false); loadTitle(c); - loadFont(c); + loadFont(c, false); break; case LOADER_ID_STATUS_BAR: - loadStatusBar(c); + loadStatusBar(c, true); break; case LOADER_ID_FONT: - loadFont(c); + loadFont(c, true); break; case LOADER_ID_ICONS: loadIcons(c, true); @@ -708,7 +708,7 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb loadWallpaper(c); break; case LOADER_ID_NAVIGATION_BAR: - loadNavBar(c); + loadNavBar(c, true); break; } } @@ -736,7 +736,7 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb } } - private void loadStatusBar(Cursor c) { + private void loadStatusBar(Cursor c, boolean animate) { int backgroundIdx = c.getColumnIndex(PreviewColumns.STATUSBAR_BACKGROUND); int wifiIdx = c.getColumnIndex(PreviewColumns.STATUSBAR_WIFI_ICON); int wifiMarginIdx = c.getColumnIndex(PreviewColumns.STATUSBAR_WIFI_COMBO_MARGIN_END); @@ -754,6 +754,12 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb int wifiMargin = c.getInt(wifiMarginIdx); int clockTextColor = c.getInt(clockColorIdx); + if (!mStatusBar.isDrawingCacheEnabled()) mStatusBar.setDrawingCacheEnabled(true); + Drawable d = null; + if (animate) { + d = new BitmapDrawable(getResources(), mStatusBar.getDrawingCache()); + } + mStatusBar.setBackground(new BitmapDrawable(getActivity().getResources(), background)); mBluetooth.setImageBitmap(bluetoothIcon); mWifi.setImageBitmap(wifiIcon); @@ -781,6 +787,9 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb String pkgName = c.getString(pkgNameIdx); mSelectedComponentsMap.put(MODIFIES_STATUS_BAR, pkgName); } + if (animate) { + animateContentChange(R.id.status_bar_container, mStatusBar, d); + } } private void loadIcons(Cursor c, boolean animate) { @@ -830,7 +839,7 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb } } - private void loadNavBar(Cursor c) { + private void loadNavBar(Cursor c, boolean animate) { int backButtonIdx = c.getColumnIndex(PreviewColumns.NAVBAR_BACK_BUTTON); int homeButtonIdx = c.getColumnIndex(PreviewColumns.NAVBAR_HOME_BUTTON); int recentButtonIdx = c.getColumnIndex(PreviewColumns.NAVBAR_RECENT_BUTTON); @@ -842,6 +851,12 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb Bitmap homeButton = Utils.loadBitmapBlob(c, homeButtonIdx); Bitmap recentButton = Utils.loadBitmapBlob(c, recentButtonIdx); + if (!mNavBar.isDrawingCacheEnabled()) mNavBar.setDrawingCacheEnabled(true); + Drawable d = null; + if (animate) { + d = new BitmapDrawable(getResources(), mNavBar.getDrawingCache()); + } + mNavBar.setBackground(new BitmapDrawable(getActivity().getResources(), background)); mBackButton.setImageBitmap(backButton); mHomeButton.setImageBitmap(homeButton); @@ -851,9 +866,18 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb String pkgName = c.getString(pkgNameIdx); mSelectedComponentsMap.put(MODIFIES_NAVIGATION_BAR, pkgName); } + if (animate) { + animateContentChange(R.id.navigation_bar_container, mNavBar, d); + } } - private void loadFont(Cursor c) { + private void loadFont(Cursor c, boolean animate) { + if (!mFontPreview.isDrawingCacheEnabled()) mFontPreview.setDrawingCacheEnabled(true); + Drawable d = null; + if (animate) { + d = new BitmapDrawable(getResources(), mFontPreview.getDrawingCache()); + } + int pkgNameIdx = c.getColumnIndex(ThemesColumns.PKG_NAME); String pkgName = pkgNameIdx >= 0 ? c.getString(pkgNameIdx) : mPkgName; TypefaceHelperCache cache = TypefaceHelperCache.getInstance(); @@ -864,6 +888,9 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb if (pkgNameIdx > -1) { mSelectedComponentsMap.put(MODIFIES_FONTS, pkgName); } + if (animate) { + animateContentChange(R.id.font_preview_container, mFontPreview, d); + } } public static ComponentName[] getIconComponents(Context context) { @@ -950,6 +977,11 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb } } + private void animateContentChange(int parentId, View viewToAnimate, Drawable overlay) { + ((ComponentCardView) getView().findViewById(parentId)) + .animateContentChange(viewToAnimate, overlay, ANIMATE_COMPONENT_CHANGE_DURATION); + } + public void fadeInCards() { mActiveCardId = -1; for (int i = 0; i < sCardIdsToComponentTypes.size(); i++) { |