标签: android-transitions

如何在Android中提供自上而下的动画?

当我进入下一个活动时,我能够给出自下而上的动画,但现在当我按下时,我使用相同的代码从上到下动画制作动画,但它总是自下而上,所以我的问题是如何给动画我在Android设备上按下按钮时从上到下?
请在下面找到我的代码.

我使用它在从一个过渡Activity到另一个过程中使用它Intent.

overridePendingTransition( R.anim.slide_in_up, R.anim.slide_out_up );
Run Code Online (Sandbox Code Playgroud)

和xml是:slide_in_up.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromYDelta="100%p" android:toYDelta="0%p"
android:duration="@android:integer/config_longAnimTime"/>
Run Code Online (Sandbox Code Playgroud)

和slide_out_up.xml是

 <?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromYDelta="0%p" android:toYDelta="-100%p"
android:duration="@android:integer/config_longAnimTime"/>
Run Code Online (Sandbox Code Playgroud)

android android-animation android-transitions

16
推荐指数
3
解决办法
4万
查看次数

FragmentTransaction.replace()淡入过渡显示"ghost"片段

您可以下载我的整个项目来尝试和调试.这是我的整个代码的回购:https://bitbucket.org/lexic92/studio48/


当我尝试用空白片段替换空白片段时,我在转换中出现了"鬼片段".

如何重现问题: 我有一个导航抽屉,当我点击一个项目时,它会打开一个填满整个屏幕的片段.

导航抽屉:

  • 按钮1 - 带文本的片段
  • 按钮2 - 空的片段

    1. 当我打开应用程序时,它会从包含文本的片段开始.然后,我打开导航抽屉并单击按钮2. 转换不良,瞬间变为空白屏幕,然后切换回淡入淡出的文本,直到它变为空白屏幕.

    2. 如果我打开导航抽屉并再次单击按钮2 ,它将从全文淡出到空白屏幕.因此,对于一个瞬间,它会在不应该的情况下显示带有文本的片段.我一步一步地在调试模式下运行我的应用程序,以减慢速度,并验证这种行为确实发生了.

    3. 如果我第三次打开导航抽屉并再次单击按钮2 ,它正确地不会显示任何动画,因为它正在淡入同一个屏幕.

有谁知道为什么会这样?你认为它与导航抽屉有什么关系吗?

这是我的整个代码的回购: https ://bitbucket.org/lexic92/studio48/

以下是一些代码摘录:

SongDetailActivity.java:

      @Override
      public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        FragmentManager fragmentManager = getSupportFragmentManager();

        //OPEN THE BLANK SCREEN
        if(position == 1) {
            fragmentManager.beginTransaction()
                    //.setCustomAnimations(R.anim.fade_in, R.anim.fade_out)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                    .replace(R.id.songlist_detail_container, PlaceholderFragment.newInstance(position + 1, mSongId))
                    .commit();
        }
        //OPEN THE SCREEN WITH TEXT
        else {
            SongDetailFragment …
Run Code Online (Sandbox Code Playgroud)

android android-animation android-fragments android-transitions

16
推荐指数
1
解决办法
5746
查看次数

未执行活动转换(Lollipop)

我正在设置活动X和活动Y之间的过渡动​​画.
X包含带有图像的列表,单击图像时会展开并在活动Y中 "缩放" .
因此,此图像是XY之间的共享元素.我已经transitionName在XML布局中设置了它的属性.
这是启动活动Y的代码:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, clickedImage, clickedImage.getTransitionName());
startActivityForResult(intent, OPEN_PICTURE_REQUEST, options.toBundle());
Run Code Online (Sandbox Code Playgroud)

直到这里,一切正常.但是,我还想在输入时为活动Y的布局设置动画.
为此,我在XML文件(picture_enter.xml)中定义了转换:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:transitionOrdering="together">

    <transition
        class="android.transition.Explode"
        android:startDelay="200">
        <targets>
            <target android:targetId="@+id/top_toolbar_container" />
        </targets>
    </transition>

</transitionSet>
Run Code Online (Sandbox Code Playgroud)

最后,在onCreate活动Y中我将初始化过渡:

TransitionInflater inflater = TransitionInflater.from(this);
Transition transition = inflater.inflateTransition(R.transition.picture_enter);
Window window = getWindow();
window.setEnterTransition(transition);
Run Code Online (Sandbox Code Playgroud)

但这从未执行过.只有图像的"缩放"效果才能正常工作.我也尝试过以编程方式定义转换.
有什么建议?

android android-activity android-transitions android-5.0-lollipop

16
推荐指数
1
解决办法
1057
查看次数

退出转换前更新源活动

在此输入图像描述

我需要有关活动之间转换的帮助:

我有两个活动A和B,两个都有一个具有相同图像列表的ViewPager.每个页面都有与一个ImageView的transitionName等于image_x其中X是页面的索引.

A启动活动B调用ActivityOptionsCompat.makeSceneTransitionAnimation,输入转换完全正常.

问题如下:当我关闭活动B时,退出转换不会在B的相同位置初始化活动A的视图寻呼机.

当用户关闭B时,后者在结果中设置当前页面位置.在onActivityResult活动A中,我调用了setCurrentItem,并且行为显示在gif中.

有没有办法在退出转换开始之前更新活动A?

android android-animation android-viewpager android-transitions

16
推荐指数
1
解决办法
846
查看次数

替换片段具有错误的高程值

你好再次堆栈溢出.我有另一个片段问题.(我正在使用android.app.Fragment而不支持片段)

我正在尝试更换片段.但这不像使用那么简单:

fragmentTransaction
    .replace(containerId, newFragment)
    .addToBackStack("unique tag")
    .commit()
Run Code Online (Sandbox Code Playgroud)

为什么不?好朋友问,因为我newFragment有过渡动画.

动画在哪里定义?另一个很棒的问题,它在碎片onCreateAnimator()中定义

为什么在那里定义?可以找到原因的长答案:嵌套片段转换不正确.现在你需要相信这就是我的项目需要做的事情.

动画是做什么的?从屏幕边缘到其中心的简单滚动,完全覆盖原始片段.请记住,在这种情况下,旧片段只是坐在原地.它具有不移动的动画效果.


问题是什么?

问题是newFragment似乎比旧版本具有更低的高程(或z?)值.因此,无法观察到过渡,因为旧片段位于新片段上方.到达动画持续时间结束时,您会看到新片段在旧片段上方闪烁.我期望newFragment从动画开始就覆盖旧版本.


为什么不使用添加?这似乎会产生更多问题,因为我有很多片段要交换进出视图.使用add似乎会在下次使用replace时触发它们的退出动画,即使前面有1 ... n个片段.他们也不会停顿.

为什么不设置高程?因为我支持没有提升属性的api 19.

为什么不对api 19使用ViewCompat.setElevation()?我尝试了它并且有相同的失败结果.

有没有人找到解决这个问题的方法?

android android-fragments fragmenttransaction android-transitions fragment-animation

16
推荐指数
1
解决办法
622
查看次数

EnterTransitionCoordinator在Android 5.0中导致NPE

添加退出并输入活动转换到应用程序后,我收到崩溃报告,如下所示:

致命异常:显示java.lang.NullPointerException:尝试在上$ android.view.ViewOverlay OverlayViewGroup.add(ViewOverlay.java空对象引用调用虚拟方法android.view.ViewParent android.view.View.getParent()': 164)在android.上移动android.app.EnterTransitionCoordinition.startSharedElementTransition(EnterTransitionCoordinator.java:325)上的android.view.View.Ov响应动画(EnterTransitionCoordinator.java:598)的android.view.ViewGroupOverlay.add(ViewGroupOverlay.java:63). app.EnterTransitionCoordinator.access $ 200(EnterTransitionCoordinator.java:42)在Android.app的android.app.EnterTransitionCoordinition $ 5 $ 1.run(EnterTransitionCoordinator.java:389)android.app.ActivityTransitionCoordinition.startTransition(ActivityTransitionCoordinator.java:698). EnterTransitionCoordinator $ 5.onPreDraw(EnterTransitionCoordinator.java:386)在android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847)在android.view.ViewRootImpl.performTraversa ls(ViewRootImpl.java:1985)在Android.view.ChoreIvers.verTraversal(ViewRootImpl.java:1077)的android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5845)at android.view.Choreographer $ CallbackRecord.run (Choreographer.java:767)位于android.view.Choreographer的舞台上的android.view.doCallbacks(Choreographer.java:580)的android.view.Choreographer $ FrameDisplayEventReceiver.run(编舞. java:753)在android.os.Handler.handleCallback(Handler.java:739)的android.os.Handler.dispatchMessage(Handler.java:95)在android.os.Looper.loop(Looper.java:135)at android.app.ActivityThread.main(ActivityThread.java:5272)位于com.android的java.lang.reflect.Method.invoke(Method.java)java.lang.reflect.Method.invoke(Method.java:372) .internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:909)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

它不可重复,但崩溃计数很重要.

做了一些研究,我发现这个提交表明它(实际上)是Android中的一个内部错误:https: //android.googlesource.com/platform/frameworks/base/+/83c692efd3c53050fce132dfd2ef21763d3cf010%5E%21/#F0

所有崩溃报告都是5.0,5.0.1或5.0.2.因为5.1有更广泛的传播,但没有显示崩溃,似乎EnterTransitionCoordinator在5.1中被修复.

因此,一种可能的解决方案是检查API级别22或更高级别,然后只进行转换.不过我想知道是否有更好的方法; 一些解决方法可能,尽管这似乎是Android的内部问题(堆栈中的所有系统类)?

android android-transitions

15
推荐指数
2
解决办法
1320
查看次数

活动动画从底部滑动

我用的是什么:

activity_stay.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="0%p"
        android:toYDelta="0%p" />

</set>
Run Code Online (Sandbox Code Playgroud)

activity_slide_to_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">

    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="0"
        android:toYDelta="100%p" />

</set>
Run Code Online (Sandbox Code Playgroud)

activity_slide_from_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">

    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="100%p"
        android:toYDelta="0" />

</set>
Run Code Online (Sandbox Code Playgroud)

启动NewActivity:

startActivity(NewActivity.getIntent(this))
overridePendingTransition(R.anim.activity_slide_from_bottom, R.anim.activity_stay)
Run Code Online (Sandbox Code Playgroud)

NewActivity完成():

finish()
overridePendingTransition(R.anim.activity_stay, R.anim.activity_slide_to_bottom)
Run Code Online (Sandbox Code Playgroud)

当NewActivity启动时,OldActivity消失 - 我看到空白的白色屏幕,NewActivity在其上方滑动到顶部.但是我需要的是我的NewActivity在启动时滑到OldActivity内容之上.我怎样才能做到这一点?

UPD:当我因为某些原因完成NewActivity时,所有动画都会完美执行:NewActivity滑到底部,OldActivity内容出现在NewActivity内容之下.

android android-animation android-xml android-activity android-transitions

15
推荐指数
3
解决办法
6844
查看次数

折叠CardView动画无法正常工作

我想做什么

我有RecyclerView很多项目,基本上是一些CardView.

这些卡片在他们的身体中间有一个支持文本,GONE默认情况下可见性设置为,VISIBLE当我点击卡片右侧的箭头时,它就会生成.

我正在尝试在文本显示的同时对卡进行动画处理,同时它会崩溃.

下图显示了扩展卡和折叠卡:

牌

CardView布局(我已经删除了可读性某些部分):

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="3dp"
    card_view:cardElevation="4dp"
    card_view:cardUseCompatPadding="true"
    android:id="@+id/root">

    <LinearLayout
        android:id="@+id/item_ll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="@dimen/activity_vertical_margin">

        <!-- The header with the title and the item -->


        <TextView
            android:id="@+id/body_content"
            style="@style/TextAppearance.AppCompat.Medium"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:layout_marginBottom="8dp"
            android:text="@string/about_page_description"
            android:textColor="@color/secondaryText"
            android:visibility="gone"/>

        <!-- The divider, and the footer with the timestamp -->

    </LinearLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)

问题

当卡片展开并露出身体时TextView,动画正在工作,但是,当我试图将其折叠回来时,动画片下方的卡片与第一张卡片重叠.

例:

卡片动画

到目前为止我尝试过的

我之前已经在这里问了一个关于这种行为类似问题,但是这个解决方案并不适用TextView于卡片的中间位置.

负责动画部分的代码在RecyclerView适配器内部.箭头有一个点击监听器,可以调用以下方法:

private …
Run Code Online (Sandbox Code Playgroud)

android android-animation kotlin android-transitions android-recyclerview

14
推荐指数
2
解决办法
1511
查看次数

片段中的共享元素和内容转换

我有以下问题:

我正试图从FragmentA 过渡到FragmentB.这些片段之间有一个共享元素,Button以及其他形式View's(参见布局).

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:flipper="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.mypackage.view.IndicatorViewFlipper
        android:transitionGroup="true"
        android:id="@+id/intro_viewflipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        flipper:indicatorColor="@color/white"
        flipper:indicatorMargin="4dp"
        flipper:indicatorRadius="4dp"
        flipper:indicatorBarMargin="104dp"/>

    <Button
        android:id="@+id/account_create_btn"
        style="?android:attr/borderlessButtonStyle"
        android:textColor="@color/white"
        android:layout_width="match_parent"
        android:layout_height="@dimen/button_standard_height"
        android:layout_above="@+id/txt_already_account"
        android:background="@drawable/button_yellow_selector"
        android:transitionName="create_account"
        android:text="@string/account_create_btn"
        android:textSize="24sp"
        android:textAllCaps="false" />

    <TextView
        android:id="@+id/txt_already_account"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_above="@+id/account_login_btn"
        android:layout_marginTop="24dp"
        android:text="@string/account_welcome_already_account"/>

    <Button
        android:id="@+id/account_login_btn"
        style="?android:attr/borderlessButtonStyle"
        android:layout_width="match_parent"
        android:layout_height="@dimen/button_standard_height"
        android:layout_marginTop="8dp"
        android:layout_alignParentBottom="true"
        android:transitionName="login"
        android:background="@drawable/button_blue_selector"
        android:textColor="@color/white"
        android:textSize="24sp"
        android:textAllCaps="false"
        android:text="@string/account_create_login_btn"/>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

我要做的是让Fragment 除了共享元素之外的所有内容,转换(向左滑动)并让所有内容形成FragmentB,除了共享元素从右边滑入.在此内容转换期间,我希望共享元素保持其原始位置,直到内容转换完成,然后让它滑动到FragmentB中的新位置.

最后一个行为是出错的地方:一旦我在FragmentA中开始退出转换,共享元素就会消失并从右边滑入,内容转换为FragmentB.如果我不添加任何退出,共享元素的行为是正确的/输入过渡.

代码(在FragmentA中):

Fragment …
Run Code Online (Sandbox Code Playgroud)

android android-transitions

13
推荐指数
1
解决办法
1615
查看次数

转换时EditText提示可见

在我的应用程序中,我正在使用Android Activity Slide过渡.我遵循了一个很好的教程,一切都按预期工作,除了我的提示EditText,其中包含InputTextLayout:

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/activity_vertical_margin">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:hint="Your name"/>
</android.support.design.widget.TextInputLayout>
Run Code Online (Sandbox Code Playgroud)

所有组件都很好地动画,但提示只是在动画开始之前弹出并保持在最终位置.我是否必须添加一些额外的代码来告诉框架为该提示设置动画?

根据Android开发人员文档,它应该工作(或者至少它不是不受支持的).

我正在使用支持设计库的22.2版.

如果有人能指出我正确的方向,那就太棒了.

android android-transitions android-textinputlayout

13
推荐指数
2
解决办法
827
查看次数