当前位置: 首页 > 知识库问答 >
问题:

平滑隐藏/显示视图的动画和填充空白的第二个视图

吕皓
2023-03-14

我正在尝试设置一个视图的动画,并在一些DP被滚动后隐藏它,我把一切都做得很好,但问题是,当你在应该触发动画的Y值之前或之后缓慢滚动时,它会弹得很厉害。

我认为轻弹是因为我必须将其可见性设置为Gone,并将其他视图更新为match_parent,它不会仅与TraslationY一起工作:

           view.animate()
                    .translationY(-view.getBottom())
                    .alpha(0)
                    .setDuration(HEADER_HIDE_ANIM_DURATION)
                    .setInterpolator(new DecelerateInterpolator());

我试图将布局设置为相对,并将2视为匹配父对象,以查看是否可以避免可见性更改,但没有成功。。。

我已经实现了Google I/O 2014 BaseActivity中所有必需的代码。java文件:https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/BaseActivity.java#L17

动画工作...但是我假设,由于我的自定义视图不是具有覆盖属性的动作栏,自定义视图不会离开,并且下面的LinearLayout不会填充空白空间(没有)。

因此,我让它与animationlistener一起工作,并在动画结束时将customview visibility设置为gone,但当您接近触发动画的预期Y点时,它将以可怕的方式闪烁(当customview visibility消失时闪烁,下面的LinearLayout需要调整自身大小以填充空白空间,如果您在此处缓慢滚动,它将快速重复)。

XML:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"


    android:clickable="false"
    android:animateLayoutChanges="true">

    <com.project.app.layouts.TabsLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
/>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/tabs">
    <FrameLayout
        android:id="@+id/content_frame_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:background="@android:color/white"/>
    </LinearLayout>

</RelativeLayout>

当它不是actionbar时,有什么方法可以做到这一点吗?

编辑:添加了一条注释,说明当你在Y点周围缓慢滚动,触发动画隐藏/显示时,它将如何弹动。

共有3个答案

连昊天
2023-03-14

我用了一种稍微不同的方式。请注意,我使用的调用需要SDK 19(KitKat),但您仍然可以使用ViewPropertyAnimatorCompat进行调用

我有一个框架布局,有标题视图和主视图,标题视图在前面。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fab="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <include layout="@layout/main_layout" android:id="@+id/main_layout" />
    <include layout="@layout/header_layout" android:id="@+id/header_layout" />
</FrameLayout>

一旦测量了视图(在onResume期间发布runnable),我就将主视图的高度设置为页眉的高度。

在“隐藏并显示”动画中,我添加了一个更新侦听器,并在其中更新主视图的顶部填充,使其成为标题的高度,即Y轴上的平移。

final View header = findViewById(R.id. header_layout);              
header.animate()
 .translationY(-header.getBottom())
 .setDuration(200)
 .setInterpolator(new DecelerateInterpolator())
 .setUpdateListener(new AnimatorUpdateListener() {          
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        int top = (int) (header.getHeight()+header.getTranslationY());
        findViewById(R.id.main_view).setPadding(0, top, 0, 0);
    }
 });

这使得它更流畅,因为填充与翻译一起更新。

实际上,使用ViewPropertyAnimatorCompat设置AnimationListener不起作用。监听器永远不会被调用,所以为了向后兼容,我选择了这个解决方案,虽然不优雅,但至少它可以在KitKat之前的设备上工作:

final View mainView = findViewById(R.id.main_view);
Runnable mainUpdateRunnable = new Runnable() {          
    @Override
    public void run() {
        int top = (int) (header.getHeight()+header.getTranslationY());
        mainView.setPadding(0, top, 0, 0);
        if (mAnimatingHeader) {
            mainView.post(this);
        }
    }
};
mainView.post(mainUpdateRunnable);

使用AnimationListener更新变量mAnimatingHeader(它可以工作)

况鸿雪
2023-03-14

我建议您检查视图的值。getBottom()在这两种情况下(无论何时有效)
可能是因为视图返回的值。getBottom()非常大
在代码中添加这一行:

Log.i("YourAppName", "view.getBottom(): -" + view.getBottom());
view.animate()
        .translationY(-view.getBottom())
        .alpha(0)
        .setDuration(HEADER_HIDE_ANIM_DURATION)
        .setInterpolator(new DecelerateInterpolator());

然后检查您的日志以查看值是否相同。

柏麒
2023-03-14

我建议您在清单文件中使用android:hardwareAccelerated=“true”属性。它将使用设备的GPU绘制视图和动画。

 类似资料:
  • 我看过一些样品,但没有一个适合我的需要。 我已经为动画创建了两个xml文件,但我不知道在更改的可见性时如何启动它们。

  • 仍然像这样显示和隐藏视图: 但如果我必须使用向上滑动和向下滑动动画来显示和隐藏,该怎么办

  • 我有一个包含4个嵌套线性布局的线性布局。我需要隐藏第一个嵌套布局并显示2和3,然后隐藏2和3并显示1。我想用滑动效果对这些过渡进行动画处理。所以有屏幕的第一张幻灯片,然后是2和3幻灯片。我设法使1滑出动画(虽然不是很顺利),但不知道如何从视图继续滑动。去查看。可见。 如果没有动画,我只需在1号做SetVisibly来隐藏它,然后在2/3号做SetVisibly来拍摄它们,这是非常容易出错的,文本重

  • 问题内容: 在iOS 11中,a中的隐藏动画的行为已更改,但是我无法在任何地方找到该文档。 iOS 10 iOS 11 两者中的代码是这样的: 如何在iOS 11上还原以前的行为? 问题答案: 只是有同样的问题。该修复程序将添加到动画块中。您要隐藏的物品的容器在哪里? 不确定为什么这在iOS 11中突然成为一个问题,但公平地说,这一直是推荐的方法。

  • 对不起,我的英语…我会试着解释我想做什么。我有一个项目。它可以在链接上下载: < Li > https://drive . Google . com/file/d/0 bxhio ufkk 3 upcxjngtmvkg 4 tdq/view?usp =共享 正如你看到的截图: http://pixs.ru/showimage/Screenshot_9509352_15647059.png “隐藏/

  • 以下是我到目前为止的布局: 我尝试通过编程方式向FrameLayout添加一个ImageButton,但这似乎不起作用。