鉴于具有共享元素的Activity的正常Lollipop转换,例如https://github.com/codepath/android_guides/wiki/Shared-Element-Activity-Transition,很常见的是从View of Recycler View转换为正常的目标活动视图.
但是,如果是目标视图,也是在recyclerView的视图中,是否有可能实现这一点(即向ActivityOptionsCompat提供目标视图)?
谢谢!
android android-transitions shared-element-transition android-5.1.1-lollipop
在我的Android应用程序中,我有一个启动画面,我在其中进行一些设置和加载.我的应用程序使用默认值explode作为a windowEnterTransition和a windowExitTransition和changeImageTransformplus changeBounds转换设置为windowSharedElementEnterTransition和windowSharedElementExitTransition.为方便起见,我Activity使用静态方法开始下一个方法,其中我将当前Activity作为a Context和共享元素传递.该帖子的第二部分提供了该代码.
其中一个场景是没有任何东西可以加载,所以应用程序几乎会立即触发下一个Activity.问题是,在这种情况下,应用程序以某种方式神秘地崩溃,ActivityTransitionCoordinator并在本文的下一部分中给出了一个堆栈.对内部的调试表明,ViewRootImpl实现的是null,并且没有空检查,因此调用viewRoot.setPausedForTransition(false)抛出a NullPointerException.你可以在下面的代码中找到这个不吉利的地方.
为了关注这个失败的场景,让我们假设一个逻辑决定没有任何东西可以加载而下一个Activity应该立即启动,这很简单,可以简化为刚开始提到的活动.
没有区别,如果第二的开始Activity被调用中onCreate(),onResume()或onEnterAnimationComplete()方法.我甚至尝试在通过调用获取的Transition上添加一个侦听器,getWindow().getSharedElementEnterTransition()并在转换完成时getWindow().getEnterTransition()允许启动下一个侦听器Activity.给定Transitions的不是null,但app永远不会进入附加的侦听器的方法.
我现在使用的解决方法是安排一个Runnable调用下一个Activity延迟的.
我想知道这是否是Android(一个SupportLibrary更具体的)问题,或者我错过了什么.有谁遇到过类似的问题?
堆栈跟踪:
08-12 00:35:32.550 26453-26453/com.faver.mkoslacz.faverdemo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.faver.mkoslacz.faverdemo, PID: 26453
java.lang.NullPointerException: Attempt to invoke virtual method …Run Code Online (Sandbox Code Playgroud) java android nullpointerexception android-support-library android-transitions
是否可以Fragments使用Android Jetpack 中的导航架构组件预先加载某些内容以获得平滑过渡?
如果没有预加载,我将永远无法获得第一次navigate()通话的平滑过渡(即使在高端设备上)。我目前使用的app:enterAnim,app:exitAnim等标签我nav_graph.xml。
我正在尝试像在 Telegram 应用程序中那样完成平滑的过渡(我认为他们正在预加载所有内容并且只是在Fragments类似中制作动画Views)。
是否有一些隐藏的 XML 属性app:preload="true"?
我不仅要求对我的问题提供全面的答案 - 也欢迎小优化!
anim_nav_enter.xml
<set
android:duration="200"
android:shareInterpolator="true">
<!-- Fade in from the right on enter -->
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0" />
<translate
android:fromXDelta="10%"
android:toXDelta="0%" />
<scale
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="1.0"
android:toYScale="1.0" />
</set>
Run Code Online (Sandbox Code Playgroud)
anim_nav_exit.xml
<set
android:duration="300"
android:shareInterpolator="true">
<!-- Fade out on exit -->
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0" />
<scale
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="1.0"
android:toYScale="1.0" /> …Run Code Online (Sandbox Code Playgroud) android android-transitions android-jetpack android-architecture-navigation
我有一个RecyclerView带有项目列表的片段。因此,当我单击某个项目时,BottomSheetDialog会打开一个。两种观点都有一些共同的观点。所以我想为此添加共享转换。我搜索 StackOverflow,但没有找到任何有关bottomsheetdialog.
所以我的问题是,是否可以将共享元素转换添加到BottomSheetDialog. 既然这是一个Fragment,应该有办法吧?有没有人有这方面的经验。?
我正在BottomSheetDialog像这样打开。
holder.cardAgenda.setOnClickListener(view -> {
AgendaBottomSheet bottomSheetFragment = AgendaBottomSheet.newInstance();
Bundle bundle = new Bundle();
bundle.putString("documentId", getSnapshots().getSnapshot(position).getId());
bundle.putString("name", model.getName());
bundle.putString("description", model.getDescription());
bundle.putString("date", dateFormat.format(timeStamp));
bundle.putString("location", model.getLocation());
bundle.putString("status", model.getStatus());
bottomSheetFragment.setArguments(bundle);
bottomSheetFragment.show(Objects.requireNonNull(getFragmentManager()), "Agenda Details");
});
Run Code Online (Sandbox Code Playgroud)
那么有没有一种方法可以像fragment中的方法一样设置共享转换addSharedElement()。
android android-transitions material-design shared-element-transition bottom-sheet
当我在片段事务中使用动画时,它工作正常,但下一个屏幕闪烁,这让我很恼火。我一直在寻找它,因为 2 天没有进展。
我正在使用此代码进行转换
public void moveToBaseSelect() {
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setCustomAnimations(R.anim.enter_from_right,R.anim.exit_to_left,R.anim.enter_from_left,R.anim.exit_to_right);
ft.replace(R.id.home_frame, new BaseSelectFragment(), HomeActivity.BASE_SELECT);
ft.addToBackStack(HomeActivity.BASE_SELECT);
ft.commit();
}
public void moveToLogin()
{
if(fragmentManager.getBackStackEntryCount()>=1 && fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-1).getName().equals(HomeActivity.LOGIN))
return;
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setCustomAnimations(R.anim.enter_from_right,R.anim.exit_to_left,R.anim.enter_from_left,R.anim.exit_to_right);
ft.replace(R.id.home_frame, new LoginFragment(), HomeActivity.LOGIN);
ft.addToBackStack(HomeActivity.LOGIN);
ft.commit();
}
Run Code Online (Sandbox Code Playgroud)
动画文件
从左边进入
<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fillAfter="true"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="-100%p"
android:toXDelta="0%p" />
</set>
</set>
Run Code Online (Sandbox Code Playgroud)
从右边进入
<?xml version="1.0" encoding="utf-8"?>
<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fillAfter="true"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="100%p"
android:toXDelta="0%p" />
</set>
</set>
Run Code Online (Sandbox Code Playgroud)
向左退出
<?xml version="1.0" encoding="utf-8"?>
<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500" …Run Code Online (Sandbox Code Playgroud) 在某些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
在显示主要活动之前,我的应用程序显示启动画面1秒钟.启动画面和主活动共享一个公共图像,该图像是从启动画面的中心到主活动布局顶部的动画所必需的.
如果<layer-list>在主要活动中将启动画面实现为背景图像(参见启动画面正确的方式或如何制作启动画面?),那么如何完成此动画并不明显,我决定实现启动画面作为正常活动,并使用共享元素转换为两个活动之间的图像设置动画.最初,我onCreate()在splash活动中使用了以下实现:
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
ImageView imageView = (ImageView)findViewById(R.id.imageView);
String transitionName = ViewCompat.getTransitionName(imageView);
Intent intent = new Intent(this, LoginActivity.class);
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(
this, imageView, transitionName);
imageView.postDelayed(() -> {
ActivityCompat.startActivity(SplashActivity.this, intent, options.toBundle());
finish();
}, 1000);
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法存在两个问题:
finish()之后立即调用startActivity()会导致在动画开始之前隐藏/销毁启动活动窗口,这导致主屏幕在动画期间暂时闪烁进入视图.为了解决第一个问题,我将finish()调用包装在postDelay()Runnable中,以确保只有在共享元素转换完成后才会调用它.在我的应用程序中有1500毫秒的延迟,但应根据其他用例所需的时间调整该值.
...
imageView.postDelayed(() -> {
ActivityCompat.startActivity(SplashActivity.this, intent, options.toBundle());
imageView.postDelayed(this::finish, 1500);
}, 1000);
Run Code Online (Sandbox Code Playgroud)
为了解决第二个问题,我重写了主活动的onBackPressed()方法直接调用, …
android splash-screen android-animation android-transitions shared-element-transition
UPDATE
我已经在谷歌https://issuetracker.google.com/issues/63663775上打开了一个错误
我正在尝试makeSceneTransitionAnimation在我当前的Android应用程序中使用.
我有一个Source Activity,它包含一个Fragment,而Fragment内部是一个RecyclerView.
当我单击RecyclerViewI过渡到我的目标Activity中的图像时,其中包含一个正确显示具有可接受动画的图像的片段.
按后退按钮可正确反转动画.
以上在纵向和横向都可以正常工作.
当我在查看目标片段时更改方向然后按后退按钮时,会出现BLINKING问题.
还有其他问题,例如图像不能直接返回到其原始位置,而在较旧的设备上,我看到水平线像来自严重调谐的模拟电视的干扰.
它的BLINKING非常糟糕,设备屏幕完全黑色约500ms.
我已下载并部署了Google示例共享元素转换应用,它似乎具有相同的"功能".
我尝试了多种解决方案,但没有一种方法可以解决,例如这样.
这是展示问题的一个.
添加了LOGCAT
07-21 12:57:18.097 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=30KB, data=21KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=30KB, data=23KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 128KB
07-21 12:57:20.540 1962-2058/com.incentive.yellowpages D/OkHttp: --> GET http://www.spyur.am/en/home/search-1/?company_name=Happy http/1.1
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=61KB, …Run Code Online (Sandbox Code Playgroud) animation android android-animation android-transitions shared-element-transition
我希望transition在我的android views视图中有一个是Button其他的EditText,转换必须像这个动画
我试过这种方式
布局xml是
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="app.itc.org.todo.MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="2">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical"
android:background="@android:color/white"
android:gravity="center_horizontal|center_vertical">
<TextView
android:id="@+id/title_tv"
android:text="@string/to_do"
android:textSize="22sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"/>
<TextView
android:id="@+id/date_tv"
android:textSize="16sp"
android:textColor="@android:color/darker_gray"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@color/colorGray"
android:gravity="center_horizontal|center_vertical"
android:orientation="vertical">
<TextView
android:text="@string/what_do_you_want_to_do_today"
android:textSize="16sp"
android:textColor="@android:color/darker_gray"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"/>
<TextView
android:text="@string/start_adding_items_to_your_to_do_list"
android:textSize="16sp"
android:textColor="@android:color/darker_gray"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
<FrameLayout
android:id="@+id/transitions_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible">
<Button
android:id="@+id/add_btn"
android:layout_width="200dp" …Run Code Online (Sandbox Code Playgroud) java animation android android-animation android-transitions
我正在TransitionManager使用以下代码使用和 约束集在场景之间制作动画。
val transition = AutoTransition()
transition.addListener(object : Transition.TransitionListener {
override fun onTransitionEnd(transition: Transition) {
// do something
}
})
val constraintSet = ConstraintSet()
constraintSet.clone(this, R.layout.frame_loading)
TransitionManager.beginDelayedTransition(rootLayout, transition)
constraintSet.applyTo(rootLayout)
Run Code Online (Sandbox Code Playgroud)
当过渡结束时我想做一些事情,因此回调。然而,有些情况下,有视图需要改变,也有视图没有需要改变。当没有任何变化时,就没有转换,也没有调用回调(如这里所解释的),这是一个问题,因为应该在转换结束时运行的操作没有运行。有没有解决这个问题的好方法,而不是像移动不可见视图或其他方式来强制预绘制事件(触发转换)的一些黑客?或者有没有办法检查是否需要转换?
android android-animation android-transitions android-constraintlayout
android ×10
animation ×3
fragment ×2
java ×2
android-architecture-navigation ×1
bottom-sheet ×1