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

隐藏操作栏/工具栏时设置内容动画

金阳曜
2023-03-14

我在Google IO repo中使用了以下代码:https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/BaseActivity.java

我试图在向上滚动时隐藏工具栏,它工作得很好,但我的问题是,当工具栏在屏幕外动画时,我的主要内容保持不变。

在R.id.toolbar_actionbar上运行动画的代码是:

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

我试着把工具栏放在一个带有内容的线性布局中,但它没有改变任何东西。只有将actionbar设置为visibility=gone,内容才会向上移动。

有人知道我必须做什么才能使内容与工具栏的翻译动画一起动画吗?

基本上,问题归结为:如何设置一个视图的位置动画,并使用它设置其他视图的动画?

谷歌IO代码似乎只是为工具栏设置了动画,其他内容也随之设置了动画,但我无法让它发挥作用。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <include
        android:id="@+id/toolbar_actionbar"
        layout="@layout/toolbar_actionbar" />

    <FrameLayout
        android:id="@+id/main_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/adsContainer"
        android:layout_below="@+id/toolbar_actionbar" />

    <LinearLayout
        android:id="@+id/adsContainer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="#000000"
        android:orientation="horizontal" />
</RelativeLayout>
<!-- The navigation drawer -->

<ExpandableListView
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#111"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp" />

</android.support.v4.widget.DrawerLayout>

共有2个答案

周子平
2023-03-14

当列表视图向上滚动时,即使actionbar(appcompat v7工具栏小部件)向上滑动,我也会遇到同样的问题,内容仍然停留在原来的位置。

遵循Christer的活动布局。

这可能是肮脏的修复,也可能是我弄乱了我的布局。但仍然在这里发布以获得更好的解决方案。所以这里是:

我的Content(片段布局)根元素是这样的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_content_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?attr/actionBarSize" >
............

我的活动布局是这样的:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <include
        android:id="@+id/toolbar_actionbar"
        layout="@layout/action_bar" />
</RelativeLayout>
.........other stuff.........

肮脏的修复方法是在片段布局中引入一个假工具栏,并将其保持在顶部。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_content_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<View
    android:id="@+id/fakeToolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_alignParentTop="true" />

.............Other elements like ListView/GridView below this........ 

in-onscroll方法使fakeToolbar可见/不可见,同时使实际工具栏上下滑动:

    mToolbar.animate().translationY(0).alpha(1)
            .setDuration(HEADER_HIDE_ANIM_DURATION)
            .setInterpolator(new DecelerateInterpolator()).withStartAction(new Runnable() {

                @Override
                public void run() {
                    fakeToolbar.setVisibility(View.VISIBLE);                        
                }
            });     

此修复程序在滚动时使布局平稳过渡。

曾元忠
2023-03-14

可以使用以下小片段设置视图高度的动画:

public void animateHeight(final View view, int from, int to, int duration) {
    ValueAnimator anim = ValueAnimator.ofInt(from, to);
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            int val = (Integer) valueAnimator.getAnimatedValue();
            ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
            layoutParams.height = val;
            view.setLayoutParams(layoutParams);
        }
    });
    anim.setDuration(duration);
    anim.start();
}

打电话给它看起来像这样:

View view = findViewById(R.id.view);
// Wait for layout to be drawn before measuring it
view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View view, int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8) {
        view.removeOnLayoutChangeListener(this);
        animateHeight(view, view.getHeight(), 0, 5000);
    }
});
 类似资料:
  • 当想下滚动页面的时候,Framework7可以让导航栏和工具栏自动隐藏。 如果你想全局启用这个功能,你只需要在 应用初始化 时候设置这几个参数:hideNavbarOnPageScroll, hideToolbarOnPageScroll, hideTabbarOnPageScroll 和 showBarsOnPageScrollEnd: 如果你只想在某些特定页面打开自动隐藏的功能,你可以通过添加

  • 我试图实现的是在滚动回收视图时隐藏折叠工具栏布局,如果再滚动,则折叠主工具栏。但我只能做到这一点http://i.imgur.com/t6wTW5H.gif. 所以我不能比这更进一步 如果我进一步滚动,我也想隐藏我的工具栏。

  • 问题内容: 我想将工具栏设置为操作栏,但是由于您的工具栏是布局元素,因此必须位于您的布局中。现在我的布局在我的片段中。 我在布局中添加了工具栏,并在片段中对其进行了调用: 之所以有效,是因为我可以设置标题等等,但是现在我希望它作为操作栏做出反应,因为我实际上想拥有它。setDisplayHomeAsUpEnabled(true) 为此,我必须将工具栏更改为操作栏: 这在我的片段中不起作用… 谁能帮

  • 我有一个活动有3个碎片(不是标签)。我有几个动作条项目,我想隐藏他们时,某个片段是存在的。我该怎么做呢?

  • 当我的项目启动时,主框架的下半部分位于任务栏下方。 如何解决这个问题。

  • 我正在构建一个应用程序,带有页面导航,需要在某些页面上显示状态栏,并在其他页面上隐藏它。我想使用淡入/淡出动画,所以我必须设置 并像这样更新状态栏: 当在页面之间导航时,这个过程非常有效,但我无法在启动时摆脱状态栏。 我试过设置: 将其添加到 将此添加到AppDelegates完成启动时使用了以下选项: 将其添加到初始页面的ViewController: 以及在链接的情节提要元素中将“状态栏”设置