我想使用Android Lollipop的新Activity Transitions.但目前我在动画片中看到非常奇怪的拾音.我把我能想到的最小样本砍在一起.
这是我在很短的版本中所做的:
styles.xmlslide.xml在我的风格中引用了一个非常简单的退出过渡android:transitionName为两个布局中的共享元素提供了一个ActivityOptions.makeSceneTransitionAnimation()使用该名称和我想要分享的视图调用startActivity()这是我看到的行为(尝试慢10倍的动画速度来看看我的意思):在幻灯片动画向下滑动未共享的视图之前,这些视图会略微下降.他们实际上分开了一点.
但是:这只会在我第二次运行该动画时发生(之后每次都会发生).第一关看起来很好.而且只有当我想与下一个活动共享元素时才会发生这种情况.如果我不尝试共享元素,一切正常.
这是我的代码:
价值观/ styles.xml
<resources>
<style name="AppTheme" parent="android:Theme.Material.Light">
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- specify exit transition -->
<item name="android:windowExitTransition">@transition/slide</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
过渡/ slide.xml
<slide />
Run Code Online (Sandbox Code Playgroud)
主要活动的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#0000ff" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#00ff00" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#0000ff" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#00ff00" />
</LinearLayout> …Run Code Online (Sandbox Code Playgroud) android android-5.0-lollipop activity-transition shared-element-transition
我正在玩Lollipop的Activity Transition.
我在Activity A中有一个按钮,当点击它时调用Activity B.在Activity B中,我重写onBackPressed()并调用finishAfterTransition()
活动B只有两个具有背景颜色的相对布局块.我已经将一个共享元素从Button转换到其中一个块,它完美地运行.即使回归过渡也有效.
但我遇到的问题是我无法取消共享元素返回转换并实现正常的退出转换.
目的是将两个滑块从屏幕上滑下,顶部一个从顶部开始,另一个从底部滑下.如果我启用了共享元素转换,则无效.
我尝试设置退出转换并将null设置为活动B上的sharedElementReturn转换.不起作用.
我尝试使用幻灯片转换在活动A上设置重新转换过渡,但仍然是在后退时反转共享元素转换.
如果我关闭共享元素转换,从活动B返回到A时,所需的效果是完美的.
有任何想法吗?
我在两个片段之间的共享元素转换正常工作.但是,问题是我不想隐藏第一个片段 - 我希望它显示在新添加的第二个片段下面.如果我不在ft.hide( firstFragment )我FragmentTransaction的共享元素中包含转换将不会运行.
如何进行共享元素转换以保持两个片段可见?
android android-fragments shared-element-transition fragment-transitions
我正在做一些基本的共享元素活动过渡动画,代码类似于:
Intent i = new Intent(AnActivity.this, AnotherActivity.class);
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(this,
Pair.create(vBackground, "background"),
Pair.create(vImage, "image"),
Pair.create(vName, "name"),
Pair.create(vDistance, "distance")
);
startActivity(i, options.toBundle());
Run Code Online (Sandbox Code Playgroud)
我可以更改动画分配给视图的Z顺序吗?
原因是一些视图在动画期间被其他视图隐藏,即使在两种活动布局中都不是这种情况.在转换代码的某处,视图的Z顺序会发生变化.
我尝试重新排序Pair.create(...),但没有取得很大的成功.
我有活动A有一个片段包含项目列表,
当我点击项目时,该项目包含ImageView 我启动包含ViewPager片段的活动B,每个片段内部都有一个包含图像的ViewPager,我想要做的是在项目列表中的第一个ImageView和图像的viewpager中显示的第一个图像之间进行共享元素转换

android android-animation android-fragments android-viewpager shared-element-transition
在某些View在我的应用我显示Fragment一些Omages的RecyclerView。当Image被点击时,一个新的细节Fragment被示出(带有输入和返回过渡)。问题是当Button从 details 按下Back 时View,共享元素View有时会消失,有时不会。
这就是我所说的新细节Fragment:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
dialog.setSharedElementEnterTransition(new DetailsTransition());
dialog.setEnterTransition(new Slide());
setExitTransition(new Fade());
dialog.setSharedElementReturnTransition(new DetailsTransition());
}
dialog.setTargetFragment(this, DETAIL_FRAGMENT);
getActivity().getSupportFragmentManager()
.beginTransaction()
.addSharedElement(view, transitionmage)
.replace(R.id.container, dialog, DetailFragment.TAG)
.addToBackStack(DetailFragment.TAG)
.commit();
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这些解决方案但没有成功:
android fragment android-transitions shared-element-transition
我的 MaterialContainerTransform 转换是从源 -> 目标进行的,但反之则不然。我的情况非常标准——我试图提供从 RecyclerView 项目(源片段)到“详细信息”片段(目标片段)的简单转换。RecyclerView 中的项目是 MaterialCardView,每个都有一个在目标 Fragment 中共享的 ImageView。
遵循这些文档https://material.io/develop/android/theming/motion似乎相当简单,尽管文档是用 Kotlin 编写的并且我使用的是 Java,所以也许我遗漏了一些东西?我在每个 RecyclerView 项中动态设置 ImageView 过渡名称,并将其传递到目标 Fragment,然后目标 Fragment 将过渡名称复制到其自己的 ImageView。通过日志记录,我可以确认每个片段中的共享transitionName 匹配。
从源 -> 目标的转换效果很好,但是当我点击后退按钮时,没有转换回来。这很奇怪,因为即使文档也声明:
片段能够定义进入和返回共享元素转换。当只设置了一个进入共享元素transition时,当Fragment弹出(返回)时会重新使用它。
有什么想法为什么返回转换(目标 -> 源)不起作用?这是相关代码:
<com.google.android.material.card.MaterialCardView
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/result_layout_card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="5dp"
app:cardElevation="4dp"
android:layout_margin="8dp"
android:clickable="true"
android:focusable="true"
android:checkable="true"
app:checkedIconTint="@color/checkedYellow"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center">
<ImageView
android:id="@+id/result_image_thumbnail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:contentDescription="@string/thumbnail_content_description"
android:src="@drawable/corolla_preview"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:orientation="vertical">
<TextView
android:id="@+id/result_text_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2018 Toyota Corolla"
style="@style/TextAppearance.MaterialComponents.Subtitle1" …Run Code Online (Sandbox Code Playgroud) java android material-design shared-element-transition android-recyclerview
我在开始时发现了SimpleDraweeView 壁画的问题.但是我用android ImageView替换后问题仍然存在.所以我无法确定问题是由于Android还是仅仅是壁画.
问题是什么
但是在我的私人项目中,以及在示例项目中.
https://github.com/JackFan-Z/ActivitySharedElementTransition
ImageView以scaleType"fitCenter"开头,这是错误的.
我试图推迟共享元素转换,并在SharedElementCallback的回调中设置不同scaleType的共享元素.但它们都没有真正起作用.任何人都可以帮助弄清楚出了什么问题,或者在哪里调试?
该问题的屏幕截图
android activity-transition shared-element-transition fresco android-5.1.1-lollipop
(请参阅代码后的更新.)
我有一个带有旋转视图的屏幕,我希望将其转换到另一个屏幕,理想情况是使用Android的内置共享元素转换功能.但是,即使旋转相同,设置View旋转时产生的动画也会被破坏.我查看了共享元素转换的各种转换效果,"ChangeTransform"特别提到了旋转(并查看代码确认了这一点).使用它或不使用它具有相同的结果.(也就是说,明确地设置或仅使用默认设置,动画外观的结果没有变化,我将在下面描述.)
那会发生什么?让我举例解释一下.让我们进行两项活动 - 我们将摆脱所有片段,因此我们知道延迟的过渡不会妨碍它们 - 称之为MainActivity和AnotherActivity.MainActivity启动具有共享元素转换的AnotherActivity活动.取两个视图,viewOnene和viewTwo.ViewOne没有轮播.ViewTwo在MainActivity中设置了旋转,但没有设置AnotherActivity.在MainActivity中,两个视图都在左侧,而在AnotherActivity中,两个视图都在右侧.它们有不同的尺寸.
以下是发生的事情:
这是倒退时发生的事情:
你可能需要自己看一下.这里:https://youtu.be/cUlVZgmJV_A
我试过直接通过代码更改转换,从样式中查看TransitionSet和引用,结果是一样的.就像转换(无论是来自代码还是XML)一样,转换被分成两半.
我创建了一个小项目来演示,如果需要可以共享整个项目.但是,我怀疑我可能只是遗漏了一些简单的东西,特别是因为一个视图在转换时工作正常.
我期望发生的是旋转随着翻译和规模平稳变化.对于动画师来说,这是相对简单的,但是如果可能的话,我想避免手动创建共享元素转换.
以下是相关文件的相关部分:
MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View viewOne = findViewById(R.id.viewOne);
final View viewTwo = findViewById(R.id.viewTwo);
viewOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AnotherActivity.class);
Pair<View, String> viewOneTx = new Pair<>(viewOne, "view_one");
Pair<View, String> viewTwoTx = new Pair<>(viewTwo, "view_two");
ArrayList<Pair<View, String>> viewsList = new ArrayList<>();
viewsList.add(viewOneTx);
viewsList.add(viewTwoTx);
ActivityOptionsCompat options;
//noinspection unchecked …Run Code Online (Sandbox Code Playgroud) 我的情况是我只有一项活动.首先,它显示fragment1,在该片段内,我有一个recyclerView来显示一个cardview列表,在每个CardView中,有一个图像.当用户点击每个CardView时,fragment1将被片段2替换.Fragment2包含一个viewPager,viewpager在fragment1中显示与recyclerView相同的数据,但更具体.我想在fragment1中的image1和fragment2中的image2之间创建一个shareElement动画.
我做的是:recyclelerView的OnLickListener,我按项目的代码为image1设置transitionName
image1.setTransitionName(item.getContentID().toString());
Run Code Online (Sandbox Code Playgroud)
替换framgent和addShareElement:
fragmentTransaction
.replace(R.id.fragment, sharedElementFragment2, FragmentEnum.FEED.toString())
.addToBackStack(null)
.addSharedElement(image1,image1.getTransitionName())
.commit();
Run Code Online (Sandbox Code Playgroud)
在viewPager的片段中,我更新了image2,其中transitionName由片段1发送
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.image2).setTransitionName(feed.getContentID()+"");
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我试图将image2放在viewpager之外(直接在片段2下)并且它可以工作.看来,当viewPager中的目标元素时,shareElement不起作用.对此有何解决方案?