0

我想使用图像作为共享元素在两个活动之间创建动画,请参阅自定义活动转换

我的问题:在源活动中,图像被绘制在自定义视图的画布上:-(

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

4

1 回答 1

1

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

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

共享元素实际上并不在活动之间移动视图,它们只是共享视图的“快照”作为位图和视图的位置。在启动的活动中,具有给定转换名称的视图将被布置在该位置。您可以根据需要使用或不使用快照。默认情况下,不使用快照。

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

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,您可以创建一个自定义 ImageView 来侦听 onVisibilityChanged。如果你有一个退出过渡,你也可以听它的结束。您只需要一些触发器来告诉您重置状态,以便删除 ImageView 并且您的自定义视图应该再次绘制图像。

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

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

于 2015-12-04T15:38:50.787 回答