我有一个RecyclerView.回收者视图的每个项目都可以扩展或不扩展.只能同时扩展一个项目.
本质上,我正在尝试在lolipop dialier中重新创建历史列表.
我发现在RecyclerView上使用LayoutTransition 使它崩溃.
但我无法正确设置两个状态之间项目视图更改的动画.
我曾尝试getItemAnimator().setSupportsChangeAnimations(true)过,notifyItemChanged(getPosition())但有两个问题:
我还尝试LayoutTransition在动画的持续时间内设置项目视图,但这种方法的问题是RecycleView的布局立即更新而不跟随动画.
我为这两个尝试创建了一个关于这个问题的小型演示项目. 项目来源在这里.
如何在项目布局更改中创建平滑过渡?
我有一个关于android布局转换框架的问题.特别地,我希望实现布局的某个部分向下或向上滑动的效果,这取决于另一个视图的可见性.
想象一下以下的布局.(请忽略嵌套的LinearLayouts;))
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:id="@+id/changingView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
<View
android:id="@+id/changingView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
</LinearLayout>
<LinearLayout
android:id="@+id/movingView"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="false"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
现在我想达到什么样的是,当changingView1和changingView2改变他们的能见度movingView或幻灯片上下.
通过为父布局启用LayoutTransition.CHANGING,滑动部件可以正常工作.但这有副作用,当添加或删除项目时,movingView也会被动画化,因为此布局会更改其边界.这就是我的问题,因为这会产生一个非常奇怪的动画.
所以回到我的问题.有没有办法保持滑动动画而不在movingView上动画布局绑定更改?
在禁用layoutTransitions movingView显然没有帮助,因为这只是影响孩子的意见动画.我也试过在父布局上启用和禁用不同的LayoutTransitions但到目前为止没有达到预期的效果.
如果我可以添加更多详细信息,请让我知道,否则我希望有人可以帮助我.
提前致谢!
我用来LayoutTransition在我的布局之一中执行自动重新排列动画。
我需要将此布局中的给定子视图排除在动画之外(出现动画)。我仍然想要任何其他视图来实现 APPEAR 效果。所以我不能简单地禁用 APPEAR 效果。
我还无法找到实现这一目标的方法。任何帮助深表感谢。
谢谢,安德罗比恩。
我在这里有这个自定义的“底部操作栏”:https : //youtu.be/TPi5jtcs2wE,它在某些类型的网页(例如,文章/非文章)中出现和消失。我将最外面的设置为LinearLayout,animateLayoutTransition并制作了另一个LayoutTransition对象,但是我希望条形图在Web视图调整其高度的同时消失。需要明确的是,条形图(relativeLayout)设置为,View.GONE并且由于条形图消失了,因此webView应该扩展为匹配父级(由于layout_weight),但是两者不能同时进行。我尝试更改LayoutTransition.setDuration()和.setStartDelay()。
articleActivity xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:id="@+id/container_article"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="app.morningsignout.com.morningsignoff.ArticleActivity"
tools:ignore="MergeRootFrame"
android:background="@android:color/white"
android:animateLayoutChanges="true">
<app.com.morningsignout.morningsignout.CustomWebView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/webView_article"
android:layout_gravity="center"
android:layout_weight="9" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:layout_weight="0"
Run Code Online (Sandbox Code Playgroud)
LayoutTransition的配置:
LinearLayout container = (LinearLayout) findViewById(R.id.container_article);
LayoutTransition customTransition = new LayoutTransition();
customTransition.enableTransitionType(LayoutTransition.CHANGING);
customTransition.disableTransitionType(LayoutTransition.CHANGE_APPEARING);
customTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
customTransition.setAnimator(LayoutTransition.APPEARING, showArticleBar);
customTransition.setAnimator(LayoutTransition.DISAPPEARING, hideArticleBar);
customTransition.setStartDelay(LayoutTransition.APPEARING, 0);
customTransition.setStartDelay(LayoutTransition.DISAPPEARING, 0);
customTransition.setStartDelay(LayoutTransition.CHANGING, 0);
customTransition.setDuration(LayoutTransition.APPEARING, showArticleBar.getDuration());
customTransition.setDuration(LayoutTransition.DISAPPEARING, hideArticleBar.getDuration());
customTransition.setDuration(LayoutTransition.APPEARING, showArticleBar.getDuration());
container.setLayoutTransition(customTransition);
Run Code Online (Sandbox Code Playgroud)
hide_action_bar.xml:
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="translationY"
android:duration="300" …Run Code Online (Sandbox Code Playgroud) 我正在尝试为LinearLayout高度设置为的视图的添加/删除操作设置动画wrap_content。
目前我已经尝试设置android:animateLayoutChanges="true"LinearLayout 并以编程方式启用这样的转换:
LayoutTransition transition = new LayoutTransition();
transition.setDuration(300);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
transition.enableTransitionType(LayoutTransition.APPEARING);
transition.enableTransitionType(LayoutTransition.DISAPPEARING);
transition.setAnimateParentHierarchy(true);
}
container.setLayoutTransition(transition);
Run Code Online (Sandbox Code Playgroud)
Appearing 似乎工作得非常流畅,并且可以根据需要设置动画和调整大小。
我遇到的问题是消失,因为LinearLayout在移除动画完成之前调整了容器的大小。
我也试过玩弄setAnimateParentHierarchy(),它似乎并没有真正影响容器调整大小的方式和时间。
android android-animation android-linearlayout layouttransition
android ×5