Fixed an issue where the top edge flickered
Because the overscroller is going over the edge, scrolling could sometimes become negative. Also, the edge position didn't actually match the position of the overscroll. Now the overscrolling is done via the stackY, which also updates the qsEdge. Fixes: 191246064 Test: overscroll with notifications, observe no flickering Change-Id: Iea994b05152f1c2465224b5371b4330a67310827
This commit is contained in:
@@ -225,8 +225,14 @@ public class AmbientState {
|
||||
return mScrollY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the new Scroll Y position.
|
||||
*/
|
||||
public void setScrollY(int scrollY) {
|
||||
this.mScrollY = scrollY;
|
||||
// Because we're dealing with an overscroller, scrollY could sometimes become smaller than
|
||||
// 0. However this is only for internal purposes and the scroll position when read
|
||||
// should never be smaller than 0, otherwise it can lead to flickers.
|
||||
this.mScrollY = Math.max(scrollY, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1148,7 +1148,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
|
||||
private void updateStackPosition() {
|
||||
// Consider interpolating from an mExpansionStartY for use on lockscreen and AOD
|
||||
float endTopPosition = mTopPadding + mExtraTopInsetForFullShadeTransition
|
||||
+ mAmbientState.getOverExpansion();
|
||||
+ mAmbientState.getOverExpansion()
|
||||
- getCurrentOverScrollAmount(false /* top */);
|
||||
final float fraction = mAmbientState.getExpansionFraction();
|
||||
final float stackY = MathUtils.lerp(0, endTopPosition, fraction);
|
||||
mAmbientState.setStackY(stackY);
|
||||
@@ -1866,6 +1867,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
|
||||
if (onTop) {
|
||||
notifyOverscrollTopListener(amount, isRubberbanded);
|
||||
}
|
||||
updateStackPosition();
|
||||
requestChildrenUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1056,10 +1056,6 @@ public class NotificationStackScrollLayoutController {
|
||||
mView.setAlpha(alpha);
|
||||
}
|
||||
|
||||
public float getCurrentOverScrollAmount(boolean top) {
|
||||
return mView.getCurrentOverScrollAmount(top);
|
||||
}
|
||||
|
||||
public float calculateAppearFraction(float height) {
|
||||
return mView.calculateAppearFraction(height);
|
||||
}
|
||||
|
||||
@@ -218,13 +218,7 @@ public class StackScrollAlgorithm {
|
||||
*/
|
||||
private void initAlgorithmState(ViewGroup hostView, StackScrollAlgorithmState state,
|
||||
AmbientState ambientState) {
|
||||
float bottomOverScroll = ambientState.getOverScrollAmount(false /* onTop */);
|
||||
int scrollY = ambientState.getScrollY();
|
||||
|
||||
// Due to the overScroller, the stackscroller can have negative scroll state. This is
|
||||
// already accounted for by the top padding and doesn't need an additional adaption
|
||||
scrollY = Math.max(0, scrollY);
|
||||
state.scrollY = (int) (scrollY + bottomOverScroll);
|
||||
state.scrollY = ambientState.getScrollY();
|
||||
state.mCurrentYPosition = -state.scrollY;
|
||||
state.mCurrentExpandedYPosition = -state.scrollY;
|
||||
|
||||
@@ -261,7 +255,7 @@ public class StackScrollAlgorithm {
|
||||
// Save the index of first view in shelf from when shade is fully
|
||||
// expanded. Consider updating these states in updateContentView instead so that we don't
|
||||
// have to recalculate in every frame.
|
||||
float currentY = -scrollY;
|
||||
float currentY = -ambientState.getScrollY();
|
||||
if (!ambientState.isOnKeyguard()) {
|
||||
currentY += mNotificationScrimPadding;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user