我目前正在使用以下代码将屏幕右侧的块转换为左侧的共享元素:
FragmentDetail newFragment = FragmentDetail.newInstance(id);
setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.trans_move));
setExitTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));
View block = view.findViewById(R.id.blocks);
block.setTransitionName("block");
newFragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.trans_move));
newFragment.setEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));
newFragment.setTransitionId(block.getTransitionName());
FragmentTransaction trans = getFragmentManager().beginTransaction();
trans.replace(R.id.container, newFragment);
trans.addToBackStack(null);
trans.addSharedElement(block, block.getTransitionName());
trans.commit();
Run Code Online (Sandbox Code Playgroud)
这正是我想要的方式,但是我希望在按下后退按钮时反转效果,将项目重新设置为动画.原样,爆炸动画播放,但过渡不会.
任何帮助是极大的赞赏.
谢谢乔希
我有一个活动A,它以横向方向永久设置,活动B没有任何预定义的方向.
如果我从活动A开始活动B并且手机旋转处于横向角度,则共享元素转换正常工作,活动B按预期以横向方向启动.如果在活动B开始期间电话旋转处于纵向角度,则会出现问题.然后,活动B以纵向方向开始(如预期的那样),但不会发生转换.
以前有人遇到过这个问题吗?任何帮助,将不胜感激.这是从活动A调用活动B的方式:
Intent mIntent = new Intent(context, ActivityB.class);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, sharedView,sharedViewTransitionName);
startActivity(mIntent,options.toBundle());
android android-animation android-5.0-lollipop activity-transition shared-element-transition
是否可以TextView通过共享的元素过渡为a动画,并在进行动画时另外从颜色过渡?
我正在从活动中的文本过渡到工具栏的文本,因此想在过渡时切换颜色...
android transition android-transitions shared-element-transition
我正在开发一个 android 应用程序,我已经使用android:launchMode="singleInstance"了它,但是当我激活它时,它不起作用,TransitionAnimation它使我的活动像这样
事实上,我的主要活动是 singleinstane,当我想参加一项新活动时,新活动不起作用并且 ui 中断。那么我可以用它做什么?有没有办法在激活 singleinstace 的同时播放动画?这是我的代码,用于午餐活动
Intent intent = new Intent(context, ActivityMall.class);
Bundle b = new Bundle();
b.putParcelable("EXTRA_MALL",((Mall)v.getTag(R.id.TAG_MALL_ID)));
b.putParcelable("EXTRA_Company",null);
intent.putExtras(b);
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) context,
(View)v.getTag(R.id.TAG_MALL_COVER2), // Starting view
"profile1" // The String
);
ActivityCompat.startActivity((Activity) context, intent, options.toBundle());
Run Code Online (Sandbox Code Playgroud)
我读过我应该设置的地方,android:launchMode="singleTask"但我不知道它与 singleinstance 的区别..非常感谢
我想定义两个 Activity 之间的转换。我的目标是在活动之间共享一个图像和两个文本,但我想为文本定义弧形运动(并保留图像的 changeBounds)。
我使用以下设置样式:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:windowSharedElementsUseOverlay">false</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
</style>
Run Code Online (Sandbox Code Playgroud)
<style name="AppTheme.DetailActivity" parent="AppTheme">
<item name="android:windowExitTransition">@transition/detail_exit</item>
<item name="android:windowEnterTransition">@transition/detail_enter</item>
<item name="android:windowSharedElementEnterTransition">@transition/detail_shared_enter</item>
<item name="android:windowSharedElementExitTransition">@transition/detail_shared_exit</item>
</style>
Run Code Online (Sandbox Code Playgroud)
我像这样启动 DetailActivity:
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this,
Pair.create(findViewById(R.id.image), "image"),
Pair.create(findViewById(R.id.text), "text"));
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
startActivity(intent, options.toBundle());
Run Code Online (Sandbox Code Playgroud)
问题是,这个 detail_shared_enter 不适用于动画:
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime">
<arcMotion android:minimumHorizontalAngle="45"
android:minimumVerticalAngle="45">
<targets>
<target android:targetId="@id/image2"/>
</targets>
</arcMotion>
<autoTransition>
<targets>
<target android:excludeId="@id/image2"/>
</targets>
</autoTransition>
</transitionSet>
Run Code Online (Sandbox Code Playgroud)
有了这个,共享元素只会出现在它们的最终位置,没有任何类型的动画。windowEnterTransition 有效。
提前感谢您的帮助!
更新: 我根据本教程找到了解决方案:https : …
animation android activity-transition shared-element-transition
AndroidStudio 2.3 Beta 1
Run Code Online (Sandbox Code Playgroud)
我试图让转换与片段一起工作,我使用的图像如何不转换.它只是正常弹出.
我已经创建了一个简单的应用程序来尝试让它工作.我有2个片段ListMovieFragment和DetailMovieFragment.1 MainActivity.
用户将单击图像ListMovieFragment以转换为DetailMovieFragment.
这是我的Transition xml change_image_transform:
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeImageTransform/>
</transitionSet>
Run Code Online (Sandbox Code Playgroud)
ListMovieFragment:
public class ListMovieFragment extends Fragment {
public interface MovieSelectedListener {
void onMovieSelected(int movieId);
}
private MovieSelectedListener mMovieSelectedListener;
public ListMovieFragment() {
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mMovieSelectedListener = (MovieSelectedListener)context;
}
@Override
public void onDetach() {
super.onDetach();
mMovieSelectedListener = null;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { …Run Code Online (Sandbox Code Playgroud) android android-fragments android-transitions shared-element-transition
我正在将Conductor API与Android DataBinding一起使用,并且一直在尝试从控制器视图到另一个控制器视图进行简单的共享元素转换,但它无法正常工作.
点击demoS列表中的"Android数据绑定"演示将带您进入一个屏幕,点击显示的textView应该将其转换到下一个屏幕.
但是现在它已经消失了.
更新:我认为在BindedBaseController类中有些不对劲?
public abstract class BindedBaseController extends Controller {
private ViewDataBinding mViewDataBinding;
protected BindedBaseController() {
}
protected BindedBaseController(Bundle args) {
super(args);
}
protected abstract View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container);
@NonNull
@Override
protected View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
View view = inflateView(inflater, container);
mViewDataBinding = DataBindingUtil.bind(view);
onViewBound(view);
return view;
}
protected void onViewBound(@NonNull View view) {
}
@Override
protected void …Run Code Online (Sandbox Code Playgroud) android shared-element-transition android-databinding conductor
我为我的应用程序实现了共享元素转换,其中转换从主屏幕上的ViewPager内的Fragment(使用RecyclerView)的图像开始,并再次扩展到全屏幕库视图,再次位于ViewPager的片段中.这一切都运行正常,但如果图像不完全可见,它会在扩展到全屏之前进入TabBar的顶部.这是发生了什么:
我的输入转换看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android">
<targets>
<target android:excludeId="@android:id/statusBarBackground"/>
<target android:excludeId="@android:id/navigationBarBackground"/>
</targets>
</fade>
Run Code Online (Sandbox Code Playgroud)
并退出:
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="together"
android:duration="500">
<fade>
<targets>
<target android:excludeId="@android:id/statusBarBackground" />
<target android:excludeId="@android:id/navigationBarBackground" />
</targets>
</fade>
</transitionSet>
Run Code Online (Sandbox Code Playgroud)
在调用活动的共享元素回调中,我得到了这个:
View navigationBar = activity.findViewById(android.R.id.navigationBarBackground);
View statusBar = activity.findViewById(android.R.id.statusBarBackground);
if (navigationBar != null) {
names.add(navigationBar.getTransitionName());
sharedElements.put(navigationBar.getTransitionName(), navigationBar);
}
if (statusBar != null) {
names.add(statusBar.getTransitionName());
sharedElements.put(statusBar.getTransitionName(), statusBar);
}
Run Code Online (Sandbox Code Playgroud)
最后在styles.xml中为activity主题:
<item name="android:windowContentTransitions">true</item>
<item name="android:windowEnterTransition">@transition/details_window_enter_transition</item>
<item name="android:windowReturnTransition">@transition/details_window_return_transition</item>
Run Code Online (Sandbox Code Playgroud)
我真的不明白如何通过转换排除工具栏(或操作栏)而不会出现这种重叠.也许一种方法是以某种方式强制图像被剪裁在顶部,这样当它在ToolBar下并且仅从可见矩形展开时它不会完全可见.
我已经尝试添加<target android:excludeId="@id/action_bar_container"/>动画的目标,但同样的事情仍然发生.
欢迎任何建议.
android android-animation android-fragments shared-element-transition
我在我的应用程序中放置了Android导航组件。
某些过渡效果很好,但是对此我有一个错误。来自片段A的过渡视图保留在新片段(B)上并隐藏一些元素。此外,当我滚动片段时,视图不会随之滚动。这是我得到的错误:
W/t.qoqa.ui.debu: Accessing hidden method Landroid/view/GhostView;->removeGhost(Landroid/view/View;)V (greylist-max-p, reflection, denied)
I/GhostViewApi21: Failed to retrieve removeGhost method
java.lang.NoSuchMethodException: android.view.GhostView.removeGhost [class android.view.View]
Run Code Online (Sandbox Code Playgroud)
我从片段A中的RecyclerView开始,在其中单击时,我设置了唯一的过渡名称。
然后,我将该名称作为参数使用SafeArgs以及FragmentNavigatorExtras中的视图进行传递。
在片段B中,我延迟了onCreate:中的过渡, postponeEnterTransition()
并设置了过渡类型:
transition = TransitionSet().apply {
addTransition(ChangeTransform())
addTransition(ChangeBounds())
startDelay = 150
}
sharedElementEnterTransition = transition
sharedElementReturnTransition = transition
Run Code Online (Sandbox Code Playgroud)
我在onViewCreated中设置名称: ViewCompat.setTransitionName(product_image, args.imageTransitionName)
最后,当准备好显示图像时,Glide Listener开始过渡:
listener = object: RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
startPostponedEnterTransition()
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?, …Run Code Online (Sandbox Code Playgroud) android android-transitions shared-element-transition android-architecture-navigation androidx
我关注了这篇android开发博客的文章,这里是他的源代码。
该演示效果很好,但通常我们更喜欢centerCrop在图像列表中使用比例类型,并fitCenter在详细模式下使用。当我修改代码来实现这一点时,transition 无法处理缩放类型的变化。当从细节片段返回时,动画以错误的比例类型开始。

我找到了ChangeImageTransform过渡。该文件说:
此转换在场景更改之前和之后捕获 ImageView 的矩阵,并在转换期间对其进行动画处理。
与 ChangeBounds 结合,ChangeImageTransform 允许更改大小、形状或ImageView.ScaleType 的 ImageViews平滑地为内容设置动画。
所以我改变了过渡集:
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="375"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:transitionOrdering="together">
<changeBounds/>
<changeImageTransform/>
</transitionSet>
Run Code Online (Sandbox Code Playgroud)
但是动画变得越来越难看:

如何在不同比例类型之间平滑转换?
android ×10
transition ×2
android-architecture-navigation ×1
androidx ×1
animation ×1
conductor ×1