使用SupportActionbar隐藏选项卡的动画效果

3

我按照android官方文档的指示,在我的应用程序中实现了一个导航抽屉。

一切正常,但由于我的一些片段正在使用选项卡,因此我希望在展开抽屉时同时“滚动”tabviews。就像这里所示:Like illustrated here. 来自我的actionBarToggle的onDrawerSlide()方法正合适,因为它传递了抽屉展开的百分比。

我在actionBarToggleonDrawerOpened()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);     
        }

我该如何获取tabs所在的view?
我正在使用适用于API 7+的support库和SupportActionBar。actionbar中包含了名为"tabhost"的组件,我该如何获取这个"tabview/host"并在运行时以编程方式更改其高度?

在支持v7库中,选项卡容器似乎没有分配任何ID。您可以手动遍历容器层次结构来查找子元素,但它可能会在未来发生变化。还要注意,选项卡可能会出现在宽屏和纵向模式下的顶部操作栏内。 - corsair992
@corsair992 ActionBar.Tab并没有扩展View,所以我无法调用getParent(),还有其他方法可以获取容器吗?我知道这个。'animation'应该只针对在图像中显示选项卡的设备和情况。 不过还是谢谢你的回复。 :) - Endzeit
以下是获取选项卡容器在层次结构中当前位置的代码:((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
@corsair992 感谢你提供的代码片段。 :) 它确实有效并返回了所需的视图。但是我无法更改它的高度。更改布局参数似乎根本不起作用。但这是正确的视图,因为我已经更改了背景颜色并且它起作用了。你有任何想法如何完成这个吗? - Endzeit
改变“LayoutParams”的尺寸在下一个布局之前不会影响任何东西。您可以阅读有关如何实现“View”动画的API指南 - corsair992
显示剩余3条评论
1个回答

1
问题在于操作栏选项卡容器会进行自身高度测量,因此为其LayoutParams分配自定义高度对其布局没有影响。虽然有一种公共方法可以更改其高度,但框架本身并没有公开容器类。
如果不使用反射,唯一改变其高度的方法是更改支持库,即使在后蜂窝设备中也要使用自己的实现而不是委托给框架,并可能在选项卡容器中添加一个隐藏滚动动画的方法,类似于导航抽屉。或者您可以使用自己的选项卡实现,可能复制操作栏中的代码。
如果您不需要在布局中重新获取选项卡空间,另一种可能性是使用淡入淡出动画。

关于使用支持库,始终使用其自己的实现,我曾经在Sherlock ActionBar中做过类似的事情。您可以参考此答案https://dev59.com/2Wkw5IYBdhLWcg3wx9eC#17469817。 - Pasquale Anatriello
谢谢你的回答。我实际上想要重新获取标签空间,以便导航抽屉也可以在高度上扩展。 否则就会有一个空白的空间,看起来很糟糕。因此,淡入淡出动画不是解决方案。如果它的类是私有的,忽略它首先只适用于ICS之前,我该如何调用这个方法?请原谅我问了这么多可能是基本的问题,但我是一个非专业人士,对Android开发还很新。 - Endzeit
@Endzeit:这个类在框架中被隐藏,但在支持库中是公开的。如果你使用的是支持库实现,那么你可以将容器转换为ScrollingTabContainerView,并调用setContentHeight()来设置其高度,然后调用其父级的forceLayout()来强制重新布局。然而,这并不能完全达到你想要的效果,因为它会导致视图缩小而不是滚动。也许可以尝试使用TranslateAnimation与调整大小相结合,以实现你的需求。或者你可以从DrawerLayout复制一些代码过来。 - corsair992
@Endzeit:如果你使用TranslateAnimation,那么你需要提供自己的自定义实现,以便在导航抽屉滚动时进行自定义转换。否则,你可以修改支持库中的ScrollingTabContainerView类,并提供一种方法,该方法将使用自定义绘图或布局逻辑在指定点滚动它出去。你可以查看DrawerLayout如何实现此操作。无论哪种方式都会有一定的复杂度,但如果你真的想这样做,那么应该是可能的(至少第二种方式)。 - corsair992
非常感谢您的帮助!我将在不久的将来尝试您的其中一个建议。不幸的是,我现在非常忙,所以我无法抽出时间去做它。 - Endzeit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接