Fix blink of final position in activity transitions.

Bug 33059372

When implementing OneShotPreDrawListener, one of the onPreDraw()
calls was supposed to return false. This CL restores that behavior.

Test: manual against Play Movies app

Change-Id: I416da3bb3e84efb009f0efbacad71d0a2f66fe18
This commit is contained in:
George Mount
2016-12-09 16:48:56 -08:00
parent d5f70891e1
commit f9c4b57b02
2 changed files with 22 additions and 7 deletions

View File

@@ -457,7 +457,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
public void onSharedElementsReady() {
final View decorView = getDecor();
if (decorView != null) {
OneShotPreDrawListener.add(decorView, () -> {
OneShotPreDrawListener.add(decorView, false, () -> {
startTransition(() -> {
startSharedElementTransition(sharedElementState);
});

View File

@@ -25,8 +25,6 @@ import android.view.ViewTreeObserver;
* OneShotPreDrawListener.add(view, () -> { view.doSomething(); })
* </code></pre>
* <p>
* The onPreDraw always returns true.
* <p>
* The listener will also remove itself from the ViewTreeObserver when the view
* is detached from the view hierarchy. In that case, the Runnable will never be
* executed.
@@ -36,22 +34,39 @@ public class OneShotPreDrawListener implements ViewTreeObserver.OnPreDrawListene
private final View mView;
private ViewTreeObserver mViewTreeObserver;
private final Runnable mRunnable;
private final boolean mReturnValue;
private OneShotPreDrawListener(View view, Runnable runnable) {
private OneShotPreDrawListener(View view, boolean returnValue, Runnable runnable) {
mView = view;
mViewTreeObserver = view.getViewTreeObserver();
mRunnable = runnable;
mReturnValue = returnValue;
}
/**
* Creates a OneShotPreDrawListener and adds it to view's ViewTreeObserver.
* Creates a OneShotPreDrawListener and adds it to view's ViewTreeObserver. The
* return value from the OnPreDrawListener is {@code true}.
*
* @param view The view whose ViewTreeObserver the OnPreDrawListener should listen.
* @param runnable The Runnable to execute in the OnPreDraw (once)
* @return The added OneShotPreDrawListener. It can be removed prior to
* the onPreDraw by calling {@link #removeListener()}.
*/
public static OneShotPreDrawListener add(View view, Runnable runnable) {
OneShotPreDrawListener listener = new OneShotPreDrawListener(view, runnable);
return add(view, true, runnable);
}
/**
* Creates a OneShotPreDrawListener and adds it to view's ViewTreeObserver.
*
* @param view The view whose ViewTreeObserver the OnPreDrawListener should listen.
* @param returnValue The value to be returned from the OnPreDrawListener.
* @param runnable The Runnable to execute in the OnPreDraw (once)
* @return The added OneShotPreDrawListener. It can be removed prior to
* the onPreDraw by calling {@link #removeListener()}.
*/
public static OneShotPreDrawListener add(View view, boolean returnValue, Runnable runnable) {
OneShotPreDrawListener listener = new OneShotPreDrawListener(view, returnValue, runnable);
view.getViewTreeObserver().addOnPreDrawListener(listener);
view.addOnAttachStateChangeListener(listener);
return listener;
@@ -61,7 +76,7 @@ public class OneShotPreDrawListener implements ViewTreeObserver.OnPreDrawListene
public boolean onPreDraw() {
removeListener();
mRunnable.run();
return true;
return mReturnValue;
}
/**