我想使用图像作为共享元素在两个活动之间创建动画,请参阅自定义活动转换
我的问题:在源活动中,图像被绘制在自定义视图的画布上:-(
有没有办法将此图像用作共享元素,还是我必须添加一个真正的 ImageView?
我想使用图像作为共享元素在两个活动之间创建动画,请参阅自定义活动转换
我的问题:在源活动中,图像被绘制在自定义视图的画布上:-(
有没有办法将此图像用作共享元素,还是我必须添加一个真正的 ImageView?
您不能只共享图像,但可以共享整个自定义视图。这意味着当共享元素转移到启动的 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!对我来说听起来更容易。