android 5上的共享元素活动转换

Tje*_*rkW 36 android android-animation activity-transition shared-element-transition android-recyclerview

我想在从一个Activity转到另一个Activity时设置共享元素转换.

第一个Activity有一个包含项目的RecyclerView.单击某个项目时,该项目应为新活动设置动画.

所以我在最终活动视图上设置了android:transitionName ="item",以及recycleler-view项目视图.

我还在进行下一个活动时使用此代码:

this.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, itemView, "boomrang_item").toBundle());
Run Code Online (Sandbox Code Playgroud)

单击某个项目时,它会正确转换并显示新视图.真的很好.但是当我点击后退按钮时.有时它工作正常,但大多数时候我的活动崩溃与下面的堆栈跟踪:

   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.ViewGroup.transformMatrixToGlobal(android.graphics.Matrix)' on a null object reference
            at android.view.GhostView.calculateMatrix(GhostView.java:95)
            at android.app.ActivityTransitionCoordinator$GhostViewListeners.onPreDraw(ActivityTransitionCoordinator.java:845)
            at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1956)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?它看起来像android 5中的一个bug

hid*_*dro 8

我遇到了同样的问题,并注意到如果原来的共享元素在你回去时在前一个屏幕上不再可见时会发生崩溃(可能它是纵向屏幕上的最后一个元素,但是一旦切换到横向,它就不再可见了) ,因此过渡无处可回放共享元素.

我的解决方法是删除返回转换(在第二个活动中)如果屏幕在返回之前已经旋转,但我确信必须有更好的方法来处理这个:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mOrientationChanged = !mOrientationChanged;
}

@Override
public void supportFinishAfterTransition() {
    if (mOrientationChanged) {
        /**
         * if orientation changed, finishing activity with shared element
         * transition may cause NPE if the original element is not visible in the returned
         * activity due to new orientation, we just finish without transition here
         */
        finish();
    } else {
        super.supportFinishAfterTransition();
    }
}
Run Code Online (Sandbox Code Playgroud)


Sab*_*ado 4

如果您使用 Proguard,请尝试将其添加到您的规则文件中。我遇到了同样的问题,它似乎有效?

-keep public class android.app.ActivityTransitionCoordinator