标签: android-transitions

共享元素转换为RecyclerView中的视图,可能吗?

鉴于具有共享元素的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

9
推荐指数
1
解决办法
1757
查看次数

当转换到其他Activity过早调用时,ActivityTransitionCoordinator中的ViewRootImpl.setPausedForTransition(boolean)NullPointerException

在我的Android应用程序中,我有一个启动画面,我在其中进行一些设置和加载.我的应用程序使用默认值explode作为a windowEnterTransition和a windowExitTransitionchangeImageTransformplus changeBounds转换设置为windowSharedElementEnterTransitionwindowSharedElementExitTransition.为方便起见,我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

8
推荐指数
1
解决办法
1958
查看次数

使用 Android Jetpack Navigation 预加载片段以实现平滑过渡

是否可以Fragments使用Android Jetpack 中的导航架构组件预先加载某些内容以获得平滑过渡?

如果没有预加载,我将永远无法获得第一次navigate()通话的平滑过渡(即使在高端设备上)。我目前使用的app:enterAnimapp: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

8
推荐指数
0
解决办法
650
查看次数

BottomSheetDialog 片段共享元素转换实现?

我有一个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

8
推荐指数
0
解决办法
592
查看次数

片段过渡时屏幕闪烁

这是按下后退按钮时录制的链接

当我在片段事务中使用动画时,它工作正常,但下一个屏幕闪烁,这让我很恼火。我一直在寻找它,因为 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)

animation android fragment android-transitions

7
推荐指数
2
解决办法
2975
查看次数

回来过渡片段共享元素消失了

在某些View在我的应用我显示Fragment一些OmagesRecyclerView。当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 Lollipop 中推迟 Fragment 的进入转换?

推迟的共享元素转换

android fragment android-transitions shared-element-transition

7
推荐指数
0
解决办法
635
查看次数

Android共享元素从初始屏幕转换为主要活动

在显示主要活动之前,我的应用程序显示启动画面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)

这种方法存在两个问题:

  1. 在调用finish()之后立即调用startActivity()会导致在动画开始之前隐藏/销毁启动活动窗口,这导致主屏幕在动画期间暂时闪烁进入视图.
  2. 从主活动按回来会自动触发共享元素返回转换,导致主活动窗口关闭后图像在主屏幕上显示为500毫秒.返回转换失败,因为splash活动已经调用了finish(),因此不再在后台堆栈上.

为了解决第一个问题,我将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

7
推荐指数
1
解决办法
1642
查看次数

方向改变后转换闪烁

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

7
推荐指数
1
解决办法
1618
查看次数

从Button转换为EditText

我希望transition在我的android views视图中有一个是Button其他的EditText,转换必须像这个动画

按钮到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

7
推荐指数
1
解决办法
1417
查看次数

当没有任何改变时不调用 TransitionListener 回调

我正在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

7
推荐指数
0
解决办法
1167
查看次数