我正在开发的应用程序显示图像网格.点击图像时,它会进入详细信息视图.详细信息视图包含一个ViewPager,允许您在网格中的每个图像之间滑动.这是通过传递路径列表(包含网格中的每个图像)以及被点击的图像的偏移来完成的,因此可以将ViewPager设置为最初显示该页面.
在ViewPager中当前偏移页面的Fragment内部进行共享元素转换的最佳方法是什么?网格(RecyclerView)图像应扩展为当前页面中的全屏图像.我看到了推迟和恢复活动转换的能力,因此应用程序将等待显示共享元素转换,直到从磁盘加载图像.但我希望能够使其在视图寻呼机中对正确的页面进行动画处理,并在用户返回时退出到当前页面的任何内容(因为您可以在页面之间滑动).如果您现在滑动到其他页面,则初始页面会回显到网格中.
目前,我使用"image_ [index]"格式的transitionName为视图寻呼机的片段中的每个图像分配.当我启动详细信息活动时,我使用相同的transitionName,索引是偏移量.
与此相关,我也想知道如何使用长按压使涟漪起作用.当您更改视图的激活状态时,它似乎取消了波纹.我想要一种类似于Gmail的效果,其中纹波重新开始并在长按完成后快速完成并触发激活状态.
animation android activity-transition shared-element-transition sharedelementcallback
在Android Lollipop中,Activity#postponeEnterTransition()和Activity#startPostponedEnterTransition()方法使Activity能够延迟开始进入和退出共享元素转换,直到加载所有数据.这些非常适合Activity过渡.
有没有办法在使用Fragment过渡时达到相同的效果?
android android-5.0-lollipop activity-transition shared-element-transition fragment-transitions
在主要活动中,我有BottomNavigationView3 个不同的父片段。父片段具有recyclerview并在 recyclerview 的项目单击时,我正在启动子片段以获取有关该项目的更多详细信息。我试图Shared Element Transition在我的两个片段(父和子)之间实现,但它没有发生。
启动子片段没有问题,我也检查了转换名称,它与我分配给适配器中的项目的子片段相同。我正在使用Random类将转换名称分配给项目,因为在单父片段中我有很多 recyclerviews。这是我的代码:
适配器
final String transition;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
transition = "transition" + new Random().nextInt(9999999);
viewHolder.image.setTransitionName(transition);
}
viewHolder.container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCallback.itemClicked(i, book, viewHolder.image, transition);
}
});
Run Code Online (Sandbox Code Playgroud)
父片段
@Override
public void itemClicked(int pos, Book book, View view, String transition) {
MainActivity activity = (MainActivity) getActivity();
ChildFragment myFragment = new ChildFragment();
Bundle bundle = new Bundle();
bundle.putString(IntentExtraKeys.TRANSITION_NAME, transition);
myFragment.setArguments(bundle);
activity.showFragmentWithTransition(this, …Run Code Online (Sandbox Code Playgroud) 我有一个视图寻呼机,其中包含4个完全不同的片段.
从该寻呼机的片段A我想创建一个像这样的新片段:
Transition changeTransform = TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_transform);
Transition explodeTransform = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode);
// Setup exit transition on first fragment
setSharedElementReturnTransition(changeTransform);
setExitTransition(explodeTransform);
// Setup enter transition on second fragment
PropertyFragment fragment = new PropertyFragment();
fragment.setSharedElementEnterTransition(changeTransform);
fragment.setEnterTransition(explodeTransform);
FragmentTransaction ft = getChildFragmentManager().beginTransaction()
.replace(R.id.container, fragment)
.addToBackStack(fragment.getFragmentTag())
.addSharedElement(icon, icon.getTransitionName())
.addSharedElement(text, text.getTransitionName());
ft.commit();
Run Code Online (Sandbox Code Playgroud)
R.id.Container是FragmentA的父RelativeRayout(不是活动的)R.transition.change_image_transform如下:
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeTransform />
<changeBounds />
<changeImageTransform/>
</transitionSet>
Run Code Online (Sandbox Code Playgroud)
片段事务工作,并发生explodeTransform.但是共享元素转换不起作用.就像他们甚至不在那里一样.我已尝试以编程方式创建转换而不是XML以及这些的所有组合:,我可以.什么都行不通.转换名称在两端都是正确的100%.
我也为事务尝试了getChildFragmentManager(),getactivity().getSupportFragmentManager(),但它也没有做任何改变.
当凝视片段不属于Viewpager时,转换也会起作用.所以问题就出现了.你有什么想法吗?我也发现了这一点:片段共享元素转换不适用于ViewPager,我认为它与我的相同,但该解决方案仅适用于Activity转换,因此它并没有真正帮助.
我正在尝试执行从片段 A 中的 RecyclerView 项目到片段 B 的共享元素转换。转换名称设置在两个布局中最外层的 CardView 上。我的实现与本示例中的实现基本相同。
一切正常,直到我在片段 B 中添加了一个 ViewPager2。
我尝试按照此答案中的步骤进行操作,但没有运气。
堆栈跟踪:
java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
at java.util.ArrayList.get(ArrayList.java:437)
at androidx.fragment.app.FragmentTransitionImpl.setNameOverridesReordered(FragmentTransitionImpl.java:182)
at androidx.fragment.app.DefaultSpecialEffectsController.startTransitions(DefaultSpecialEffectsController.java:665)
at androidx.fragment.app.DefaultSpecialEffectsController.executeOperations(DefaultSpecialEffectsController.java:114)
at androidx.fragment.app.SpecialEffectsController.executePendingOperations(SpecialEffectsController.java:294)
at androidx.fragment.app.Fragment$3.run(Fragment.java:2776)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Run Code Online (Sandbox Code Playgroud)
编辑:显示我的依赖项以回应建议片段版本需要更新的答案:
ext.kotlin_version = "1.5.10"
ext.navigation_version="2.4.0-alpha02"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.preference:preference-ktx:1.1.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3'
implementation …Run Code Online (Sandbox Code Playgroud) android android-fragments shared-element-transition android-architecture-navigation android-viewpager2
我有一个RecyclerView在一个Viewpager片段内和从一个项目中共享元素RecyclerView的DetailActivity含有片段.我正在DetailActivity为片段的进入和退出设置转换.
public static void sharedTransitionReceiver(Activity activity, Fragment fragment) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().getEnterTransition().setDuration(500);
Slide slideTransition = new Slide(Gravity.START);
slideTransition.setDuration(500);
fragment.setReenterTransition(slideTransition);
fragment.setExitTransition(slideTransition);
fragment.setSharedElementEnterTransition(new ChangeBounds());
}
}
Run Code Online (Sandbox Code Playgroud)
它运行得很好但是当我导航回包含Viewpager退出的上一个活动时,动画不起作用,并且项目不会动画回原始位置.