java - 使用自定义 View 中的共享元素启动 Activity

标签 java android android-animation shared-element-transition activity-transition

我想在两个 Activity 之间创建一个动画,并将图像作为共享元素,请参阅 Customize Activity Transitions

我的问题:在源 Activity 中,图像绘制在自定义 View 的 Canvas 上:-(

有没有办法将此图像用作共享元素,或者我是否必须添加真正的 ImageView?

最佳答案

您不能仅共享图像,但可以共享整个自定义 View 。这意味着当共享元素传输到启动的 Activity 时,整个自定义 View 将从调用 Activity 中消失。如果你的自定义 View 只有图像,那就没问题,但如果它绘制其他东西,那将是灾难性的。

如果您只想共享图像,则必须创建一个 View (例如 ImageView)并将图像移动到其中,然后共享它。这样,当共享元素被传输时,它就会从调用 Activity 中正确隐藏。

共享元素实际上并不在 Activity 之间移动 View ,它们只是以位图形式共享 View 的“快照”以及 View 的位置。在启动的 Activity 中,具有给定转换名称的 View 将布置在该位置。您可以使用或不使用快照,具体取决于您的需要。默认情况下不使用快照。

所以你需要一些像这样的代码:

public void launchActivity(final Intent intent, final CustomView view) {
    final Bitmap bitmap = view.getSharedImage();
    ImageView imageView = new ImageView(view.getContext());
    imageView.setBitmap(bitmap);
    LayoutParams layoutParams = view.createSharedImageLayoutParams();
    final ViewGroup parent = (ViewGroup)view.getParent();
    parent.addView(imageView, layoutParams);
    parent.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            parent.getViewTreeObserver().removeOnPreDrawListener(this);
            customView.hideSharedImage();
            ActivityOptions activityOptions = ActivityOptions.
                makeSceneTransitionAnimation(this, imageView, "destName");
            startActivity(intent, activityOptions.toBundle();
        }
    });
    setExitSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onSharedElementsArrived(List<String> sharedElementNames,
            List<View> sharedElements, OnSharedElementsReadyListener listener) {
            super.onSharedElementsArrived(sharedElementNames, sharedElements,
                listener);
            parent.removeView(imageView);
            customView.showSharedImage();
        }
    });
}

我没有具体尝试过上面的内容,但这就是它的本质。如果您不想使用较新的 onSharedElementsArrived,您可以创建一个监听 onVisibilityChanged 的​​自定义 ImageView。如果您有退出过渡,您也可以聆听它的结尾。您只需要一些触发器来告诉您重置状态,以便删除 ImageView 并且您的自定义 View 应该再次绘制图像。

在上面的示例中,我将 ImageView 放置在与自定义 View 相同的父级中。通过将其放入 DecorView 中,您可能会获得更大的灵 active ,但您必须弄清楚全局位置是什么,并且它还将覆盖屏幕上的所有内容。或者,由于我将 ImageView 添加到了父级,因此这不适用于所有父级(例如 ListView、LinearLayout)。您知道您的 View 层次结构,并且必须选择放置它的最佳位置。

或者,您可以将自定义 View 更改为自定义 ViewGroup 并将可共享图像包含为 ImageView!对我来说听起来更容易。

关于java - 使用自定义 View 中的共享元素启动 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34070781/

相关文章:

安卓 9 : Cleartext HTTP traffic not permitted in webview

android - OutOfMemoryError captureSharedElementState androidL

java - 我有一个字符串在 spring 上下文中包含 ${key}

JAVA - 读取文件并将其放入数组列表

java - 如何在同一个矩形上进行两次触摸

android - 扩展应用程序的类抛出 ClassNotFoundException

java - 实例化抽象类解决方法

android - 将 Android 应用程序限制为仅适用于 armv7 设备

Android ListView 飞入动画

java - 一个接一个地动画 View