【问题标题】:Lollipop shared element transition for mapView?MapView 的棒棒糖共享元素过渡?
【发布时间】:2018-06-24 17:03:29
【问题描述】:

我有一个占屏幕一小部分的 mapView,当触摸它时会打开一个全屏视图。

我通过在两个片段之间切换来实现这一点。

我很想使用新的 Lollipop 动画框架将小 mapView 无缝扩展到更大的 mapView(从 Fragment1 到 Fragment2)。

不幸的是,我无法让它工作——我想知道是否有人能够让 mapView 与新的动画框架一起工作。

我的代码:

@SuppressLint("NewApi")
public void launchMapFullscreenFragment(Fragment previousFragment, MapView mapView)
{
    // Launch fragment to view Google Maps
    FragmentMapFullScreen fragment = new FragmentMapFullScreen();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        previousFragment.setSharedElementReturnTransition(TransitionInflater.from(this).inflateTransition(R.transition.change_image_transform));
        previousFragment.setExitTransition(TransitionInflater.from(this).inflateTransition(android.R.transition.explode));

        // Create new fragment to add (Fragment B)
        fragment.setSharedElementEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.change_image_transform));
        fragment.setEnterTransition(TransitionInflater.from(this).inflateTransition(android.R.transition.explode));

        // Add Fragment B
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction()
                .replace(R.id.content_frame, fragment)
                .addToBackStack("transaction")
                .addSharedElement(mapView, "MyTransition");
        ft.commit();
    }
    else
    {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.setCustomAnimations(R.anim.slide_in_left, R.anim.abc_fade_out);
        ft.replace(R.id.content_frame, fragment, FRAGMENT_MAP_FULLSCREEN);
        ft.addToBackStack(null);
        ft.commit();
    }
}

change_image_transform.xml

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeTransform />
</transitionSet>

【问题讨论】:

    标签: android android-animation android-mapview android-5.0-lollipop


    【解决方案1】:

    我没有明确使用 MapView,但文档将其显示为 FrameLayout,它应该可以工作。您还没有显示您的两个布局文件。 ChangeTransform 将根据源 Fragment 中的值对目标 Fragment 中的缩放、平移和旋转进行动画处理。如果您没有在源或目标 Fragment 的 MapView 中设置 scaleX 或 scaleY,则 ChangeTransform 不会做任何特别的事情。

    如果 MapView 正在改变大小(不仅仅是缩放),您应该将 ChangeBounds Transition 与 ChangeTransform 一起添加到它。

    另一个问题可能是您传递给 addSharedElement 的参数。名称“MyTransition”应与目标 Fragment (FragmentMapFullScreen) 中 MapView 的 transitionName 匹配。所以你的 MapView 应该是这样的:

    <MapView android:transitionName="MyTransition" ... />
    

    如果您怀疑 MapView 是罪魁祸首(它可能是罪魁祸首,具体取决于其实现),您可以尝试使用 TextView 来查看转换是否符合您的预期。

    【讨论】:

      【解决方案2】:

      我已经在另一个活动中使用 MapView 完成了它,而不是使用 MapFragment。只需推迟转换并在 onMapReady 回调结束时恢复它。

      【讨论】:

        猜你喜欢
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-15
        • 2015-08-12
        • 2020-04-16
        • 2016-05-02
        • 2015-05-22
        相关资源
        最近更新 更多