Merge "Work on QS animation curves" into nyc-dev
This commit is contained in:
@@ -14,11 +14,11 @@
|
|||||||
|
|
||||||
package com.android.systemui.qs;
|
package com.android.systemui.qs;
|
||||||
|
|
||||||
|
import android.graphics.Path;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnAttachStateChangeListener;
|
import android.view.View.OnAttachStateChangeListener;
|
||||||
import android.view.View.OnLayoutChangeListener;
|
import android.view.View.OnLayoutChangeListener;
|
||||||
import android.view.animation.PathInterpolator;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import com.android.systemui.qs.PagedTileLayout.PageListener;
|
import com.android.systemui.qs.PagedTileLayout.PageListener;
|
||||||
import com.android.systemui.qs.QSPanel.QSTileLayout;
|
import com.android.systemui.qs.QSPanel.QSTileLayout;
|
||||||
@@ -40,9 +40,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
|
|||||||
private static final String ALLOW_FANCY_ANIMATION = "sysui_qs_fancy_anim";
|
private static final String ALLOW_FANCY_ANIMATION = "sysui_qs_fancy_anim";
|
||||||
private static final String MOVE_FULL_ROWS = "sysui_qs_move_whole_rows";
|
private static final String MOVE_FULL_ROWS = "sysui_qs_move_whole_rows";
|
||||||
|
|
||||||
public static final PathInterpolator TRANSLATION_Y_INTERPOLATOR =
|
|
||||||
new PathInterpolator(.1f, .3f, 1, 1);
|
|
||||||
|
|
||||||
public static final float EXPANDED_TILE_DELAY = .7f;
|
public static final float EXPANDED_TILE_DELAY = .7f;
|
||||||
|
|
||||||
private final ArrayList<View> mAllViews = new ArrayList<>();
|
private final ArrayList<View> mAllViews = new ArrayList<>();
|
||||||
@@ -56,7 +53,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
|
|||||||
private boolean mOnFirstPage = true;
|
private boolean mOnFirstPage = true;
|
||||||
private TouchAnimator mFirstPageAnimator;
|
private TouchAnimator mFirstPageAnimator;
|
||||||
private TouchAnimator mFirstPageDelayedAnimator;
|
private TouchAnimator mFirstPageDelayedAnimator;
|
||||||
private TouchAnimator mTranslationYAnimator;
|
private TouchAnimator mTranslationAnimator;
|
||||||
private TouchAnimator mNonfirstPageAnimator;
|
private TouchAnimator mNonfirstPageAnimator;
|
||||||
|
|
||||||
private boolean mOnKeyguard;
|
private boolean mOnKeyguard;
|
||||||
@@ -129,6 +126,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
|
|||||||
|
|
||||||
private void updateAnimators() {
|
private void updateAnimators() {
|
||||||
TouchAnimator.Builder firstPageBuilder = new Builder();
|
TouchAnimator.Builder firstPageBuilder = new Builder();
|
||||||
|
TouchAnimator.Builder translationXBuilder = new Builder();
|
||||||
TouchAnimator.Builder translationYBuilder = new Builder();
|
TouchAnimator.Builder translationYBuilder = new Builder();
|
||||||
TouchAnimator.Builder firstPageDelayedBuilder = new Builder();
|
TouchAnimator.Builder firstPageDelayedBuilder = new Builder();
|
||||||
Collection<QSTile<?>> tiles = mQsPanel.getHost().getTiles();
|
Collection<QSTile<?>> tiles = mQsPanel.getHost().getTiles();
|
||||||
@@ -138,7 +136,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
|
|||||||
int lastYDiff = 0;
|
int lastYDiff = 0;
|
||||||
firstPageDelayedBuilder.setStartDelay(EXPANDED_TILE_DELAY);
|
firstPageDelayedBuilder.setStartDelay(EXPANDED_TILE_DELAY);
|
||||||
firstPageBuilder.setListener(this);
|
firstPageBuilder.setListener(this);
|
||||||
translationYBuilder.setInterpolator(TRANSLATION_Y_INTERPOLATOR);
|
|
||||||
// Fade in the tiles/labels as we reach the final position.
|
// Fade in the tiles/labels as we reach the final position.
|
||||||
firstPageDelayedBuilder.addFloat(mQsPanel.getTileLayout(), "alpha", 0, 1);
|
firstPageDelayedBuilder.addFloat(mQsPanel.getTileLayout(), "alpha", 0, 1);
|
||||||
mAllViews.clear();
|
mAllViews.clear();
|
||||||
@@ -158,7 +155,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
|
|||||||
final int yDiff = loc2[1] - loc1[1];
|
final int yDiff = loc2[1] - loc1[1];
|
||||||
lastYDiff = yDiff;
|
lastYDiff = yDiff;
|
||||||
// Move the quick tile right from its location to the new one.
|
// Move the quick tile right from its location to the new one.
|
||||||
firstPageBuilder.addFloat(quickTileView, "translationX", 0, xDiff);
|
translationXBuilder.addFloat(quickTileView, "translationX", 0, xDiff);
|
||||||
translationYBuilder.addFloat(quickTileView, "translationY", 0, yDiff);
|
translationYBuilder.addFloat(quickTileView, "translationY", 0, yDiff);
|
||||||
|
|
||||||
// Counteract the parent translation on the tile. So we have a static base to
|
// Counteract the parent translation on the tile. So we have a static base to
|
||||||
@@ -167,7 +164,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
|
|||||||
|
|
||||||
// Move the real tile's label from the quick tile position to its final
|
// Move the real tile's label from the quick tile position to its final
|
||||||
// location.
|
// location.
|
||||||
firstPageBuilder.addFloat(label, "translationX", -xDiff, 0);
|
translationXBuilder.addFloat(label, "translationX", -xDiff, 0);
|
||||||
translationYBuilder.addFloat(label, "translationY", -yDiff, 0);
|
translationYBuilder.addFloat(label, "translationY", -yDiff, 0);
|
||||||
|
|
||||||
mTopFiveQs.add(tileIcon);
|
mTopFiveQs.add(tileIcon);
|
||||||
@@ -188,7 +185,13 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
|
|||||||
if (mAllowFancy) {
|
if (mAllowFancy) {
|
||||||
mFirstPageAnimator = firstPageBuilder.build();
|
mFirstPageAnimator = firstPageBuilder.build();
|
||||||
mFirstPageDelayedAnimator = firstPageDelayedBuilder.build();
|
mFirstPageDelayedAnimator = firstPageDelayedBuilder.build();
|
||||||
mTranslationYAnimator = translationYBuilder.build();
|
Path path = new Path();
|
||||||
|
path.moveTo(0, 0);
|
||||||
|
path.cubicTo(0, 0, 0, 1, 1, 1);
|
||||||
|
mTranslationAnimator = new TouchAnimator.Builder()
|
||||||
|
.addPath(translationXBuilder.build(), translationYBuilder.build(),
|
||||||
|
"position", "position", path)
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
mNonfirstPageAnimator = new TouchAnimator.Builder()
|
mNonfirstPageAnimator = new TouchAnimator.Builder()
|
||||||
.addFloat(mQuickQsPanel, "alpha", 1, 0)
|
.addFloat(mQuickQsPanel, "alpha", 1, 0)
|
||||||
@@ -226,7 +229,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
|
|||||||
mQuickQsPanel.setAlpha(1);
|
mQuickQsPanel.setAlpha(1);
|
||||||
mFirstPageAnimator.setPosition(position);
|
mFirstPageAnimator.setPosition(position);
|
||||||
mFirstPageDelayedAnimator.setPosition(position);
|
mFirstPageDelayedAnimator.setPosition(position);
|
||||||
mTranslationYAnimator.setPosition(position);
|
mTranslationAnimator.setPosition(position);
|
||||||
} else {
|
} else {
|
||||||
mNonfirstPageAnimator.setPosition(position);
|
mNonfirstPageAnimator.setPosition(position);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,11 @@
|
|||||||
|
|
||||||
package com.android.systemui.qs;
|
package com.android.systemui.qs;
|
||||||
|
|
||||||
|
import android.graphics.Path;
|
||||||
|
import android.graphics.PathMeasure;
|
||||||
|
import android.util.FloatProperty;
|
||||||
import android.util.MathUtils;
|
import android.util.MathUtils;
|
||||||
|
import android.util.Pair;
|
||||||
import android.util.Property;
|
import android.util.Property;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.animation.Interpolator;
|
import android.view.animation.Interpolator;
|
||||||
@@ -74,6 +78,19 @@ public class TouchAnimator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final FloatProperty<TouchAnimator> POSITION =
|
||||||
|
new FloatProperty<TouchAnimator>("position") {
|
||||||
|
@Override
|
||||||
|
public void setValue(TouchAnimator touchAnimator, float value) {
|
||||||
|
touchAnimator.setPosition(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Float get(TouchAnimator touchAnimator) {
|
||||||
|
return touchAnimator.mLastT;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public static class ListenerAdapter implements Listener {
|
public static class ListenerAdapter implements Listener {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationAtStart() { }
|
public void onAnimationAtStart() { }
|
||||||
@@ -124,6 +141,19 @@ public class TouchAnimator {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder addPath(Object target, String xProp, String yProp,
|
||||||
|
Path path) {
|
||||||
|
return addPath(target, target, xProp, yProp, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addPath(Object xTarget, Object yTarget, String xProp, String yProp,
|
||||||
|
Path path) {
|
||||||
|
add(new Pair<>(xTarget, yTarget),
|
||||||
|
KeyframeSet.ofPath(getProperty(xTarget, xProp, float.class),
|
||||||
|
getProperty(yTarget, yProp, float.class), path));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
private void add(Object target, KeyframeSet keyframeSet) {
|
private void add(Object target, KeyframeSet keyframeSet) {
|
||||||
mTargets.add(target);
|
mTargets.add(target);
|
||||||
mValues.add(keyframeSet);
|
mValues.add(keyframeSet);
|
||||||
@@ -152,6 +182,9 @@ public class TouchAnimator {
|
|||||||
return View.SCALE_Y;
|
return View.SCALE_Y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (target instanceof TouchAnimator && "position".equals(property)) {
|
||||||
|
return POSITION;
|
||||||
|
}
|
||||||
return Property.of(target.getClass(), cls, property);
|
return Property.of(target.getClass(), cls, property);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,6 +241,10 @@ public class TouchAnimator {
|
|||||||
public static KeyframeSet ofFloat(Property property, float... values) {
|
public static KeyframeSet ofFloat(Property property, float... values) {
|
||||||
return new FloatKeyframeSet((Property<?, Float>) property, values);
|
return new FloatKeyframeSet((Property<?, Float>) property, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static KeyframeSet ofPath(Property xProp, Property yProp, Path path) {
|
||||||
|
return new PathKeyframeSet<>(xProp, yProp, path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class FloatKeyframeSet<T> extends KeyframeSet {
|
private static class FloatKeyframeSet<T> extends KeyframeSet {
|
||||||
@@ -245,4 +282,31 @@ public class TouchAnimator {
|
|||||||
mProperty.set((T) target, (int) (firstFloat + (secondFloat - firstFloat) * amount));
|
mProperty.set((T) target, (int) (firstFloat + (secondFloat - firstFloat) * amount));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class PathKeyframeSet<T> extends KeyframeSet {
|
||||||
|
private final Property<T, Float> mXProp;
|
||||||
|
private final Property<T, Float> mYProp;
|
||||||
|
private final Path mPath;
|
||||||
|
private final PathMeasure mPathMeasure;
|
||||||
|
private final float mLength;
|
||||||
|
private final float[] mPos;
|
||||||
|
|
||||||
|
public PathKeyframeSet(Property<T, Float> xProp, Property<T, Float> yProp, Path path) {
|
||||||
|
super(2);
|
||||||
|
mXProp = xProp;
|
||||||
|
mYProp = yProp;
|
||||||
|
mPath = path;
|
||||||
|
mPathMeasure = new PathMeasure(mPath, false);
|
||||||
|
mLength = mPathMeasure.getLength();
|
||||||
|
mPos = new float[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void interpolate(int index, float amount, Object target) {
|
||||||
|
Pair<Object, Object> targets = (Pair<Object, Object>) target;
|
||||||
|
mPathMeasure.getPosTan(amount * mLength, mPos, null);
|
||||||
|
mXProp.set((T) targets.first, mPos[0]);
|
||||||
|
mYProp.set((T) targets.second, mPos[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user