【问题标题】:Animation for hiding tabs with SupportActionbar使用 SupportActionbar 隐藏选项卡的动画
【发布时间】:2014-01-04 12:00:28
【问题描述】:

我已经按照in the android documentation.的指示在我的应用中实现了一个导航抽屉

一切正常,但由于我的一些片段正在使用标签,我想在抽屉展开的同时“滚动”tabviews。如这里所示: 我的actionBarToggle 中的 onDrawerSlide() 方法非常适合它,因为它传递了抽屉展开距离的百分比。

我在actionBarToggle 的onDrawerOpened() 和onDrawerClosed() 方法中更改了操作栏的导航模式,一切正常。但我想要某种动画,因为它现在看起来很粗暴。 [抽屉打开 - puff 标签消失了puff;抽屉关闭 - puff 标签又出现了 puff]

我当前的代码。

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle =
            new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer,
                    R.string.navigation, R.string.closed) {

                public void onDrawerClosed(View view) {
                    supportInvalidateOptionsMenu();
                }

                public void onDrawerOpened(View drawerView) {
                    setTitle(getString(R.string.navigation));
                    setIcon(R.drawable.abc_ic_search_api_holo_light);

                    supportInvalidateOptionsMenu();
                }

                @Override
                public void onDrawerSlide(View drawerView, float slideOffset) {
                    // TODO animation 
                    super.onDrawerSlide(drawerView, slideOffset);
                }
            };

我希望得到诸如获取 tabhost/view 之类的东西并根据 slideOffset 设置它的高度。

                @Override
                public void onDrawerSlide(View drawerView, float slideOffset) {
                    TabView tabView = actionBar.getTabView(); // how do I get the view where the tabs are shown?
                    ViewGroup.LayoutParams tabViewLayoutParams = tabView.getLayoutParams();
                    ViewGroup.LayoutParams tabViewNewLayoutParams = new ViewGroup.LayoutParams(a.width, (int)((1 - slideOffset) * normalTabHeight))
                    drawer.setLayoutParams(tabViewNewLayoutParams );

                    super.onDrawerSlide(drawerView, slideOffset);     
        }

如何获得view 所在的tabs?

我正在使用支持库 API 7+ 和 SupportActionBar。

“tabhost”是如何包含在操作栏中的?是否有可能获得这个“tabview/host”并以编程方式在运行时更改它的高度?

【问题讨论】:

  • 在 support v7 库中似乎没有为标签容器分配任何 ID。您可以通过手动浏览容器层次结构来找到孩子,但将来可能会发生变化。另请注意,这些选项卡可以出现在宽屏和纵向模式下的顶部操作栏内。
  • @corsair992 由于 ActionBar.Tab 没有扩展 View 我不能调用 getParent() 或者有其他方法来获取容器吗?我知道这件事。 “动画”应仅适用于选项卡在图像中显示的设备和情况。不过感谢您的回复。 :)
  • 这里有一些代码可以从它在层次结构中的当前位置获取标签容器:((ViewGroup)getWindow().findViewById(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB ? android.support.v7.appcompat.R.id.action_bar_container : Resources.getSystem().getIdentifier("action_bar_container", "id", "android"))).getChildAt(2); 请注意,如果容器包含在顶部操作栏中,这将返回 null。
  • @corsair992 感谢您提供代码 sn-p。 :) 这实际上有效并返回所需的视图。但我不能改变它的高度。更改布局参数似乎根本不起作用。但这是正确的视图,因为我更改了背景颜色并且它起作用了。你知道如何做到这一点吗?
  • 更改LayoutParams 尺寸不会影响任何内容,直到下一个布局。您可以在API guides 中了解如何实现View 动画。

标签: java android animation android-actionbar android-tabhost


【解决方案1】:

问题在于操作栏选项卡容器自己进行高度测量,因此为其LayoutParams 分配自定义高度对其布局没有影响。 有一个公共方法来改变它的高度,但是容器类本身并没有被框架暴露出来。

在不使用反射的情况下改变它的高度的唯一方法是改变支持库以使用它自己的实现,即使在后蜂窝设备中,而不是委托给框架,并且可能在选项卡容器中添加一个方法来隐藏滚动动画类似于导航抽屉。或者您可以使用自己的选项卡实现,可能从操作栏中复制代码。

如果您不需要回收布局中的选项卡空间,另一种可能性是使用淡入淡出动画。

【讨论】:

  • 关于使用使支持库始终使用其 onw 实现,我对 sherlock 操作栏做了类似的事情。你可以参考这个答案stackoverflow.com/questions/9652075/…
  • 感谢您的回答。我实际上想回收选项卡空间,以便导航抽屉的高度也在扩展。否则只会有一个看起来很糟糕的空白空间。因此,淡入淡出动画将不是解决方案。如果它的类是私有的,我该如何调用这个方法,而忽略它最初只能用于 ICS 之前?请原谅我问了这么多可能很基础的问题,但我不是专业人士,对 Android 开发还是很陌生。
  • @Endzeit:该类隐藏在框架中,但在支持库中是公开的。如果您正在使用支持库实现,那么您可以将容器转换为ScrollingTabContainerView 并在其上调用setContentHeight() 以设置其高度,然后在其父对象上调用forceLayout() 以强制它进行重新布局。但是,这不会完全实现您正在寻找的内容,因为它会导致 View 缩小而不是滚动。也许将TranslateAnimation 与调整大小结合使用将达到您想要的效果。或者你可以从DrawerLayout复制一些代码。
  • @Endzeit:如果您使用TranslateAnimation,那么您将需要提供您自己的自定义实现,它将针对导航抽屉滚动进行自定义转换。否则,您可以修改支持库中的ScrollingTabContainerView 类,并提供一种方法,该方法可以使用自定义绘图或布局逻辑在指定点将其滚动。你可以看看DrawerLayout 是如何做到这一点的。无论哪种方式实现起来都会有些复杂,但如果你真的想这样做,那么它应该是可能的(至少是第二种)。
  • 非常感谢您的帮助!我会在新的未来尝试你的建议之一。不幸的是,我现在很忙,所以我没有时间去做。
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 2022-11-11
  • 1970-01-01
相关资源
最近更新 更多