如何在滚动列表视图时拥有能力控制操作栏?

时间:2015-04-13 17:07:57

标签: android android-listview android-actionbar onscrolllistener

我正在使用appCompat操作栏。我尝试制作像instagram这样的主页,同时用户向下滚动操作栏是隐藏的,反之亦然。

以下代码是滚动列表视图时隐藏和显示操作的最基本方法

int mLastFirstVisibleItem = 0;

if (view.getId() == mListView.getId()) {
    final int currentFirstVisibleItem = mListView.getFirstVisiblePosition();

    if (currentFirstVisibleItem > mLastFirstVisibleItem) {
        getSupportActionBar().hide();
    } else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
        getSupportActionBar().show();
    }

     mLastFirstVisibleItem = currentFirstVisibleItem;
}

问题是当我慢慢滚动列表视图时,操作栏将保持隐藏并重复显示。它不会让我能够控制我想隐藏多少或显示操作栏。我想要的是当我向下或向上滚动列表视图时,操作栏将最终跟随手势,当用户从屏幕上切换它将隐藏或显示时,取决于屏幕上保持可见操作栏的大小。

例如,当我向下滚动2px时,操作栏将上升或隐藏2px。如果操作栏大小保留在屏幕上是20px,而操作栏大小是50px,它将隐藏它,如下面的代码。

//this is just a demo of how I want the action bar to work not any type of programming language
//visibleActionBarOnscreen is the actionbarsize remain on screen

if(visibleActionBarOnScreen > actiobarSize/2){
    //show the action bar
}else{
    //hide the action bar
}

Push out/pull in ActionBar when ListView is scrolled此链接教授如何控制操作栏。但是我仍然不知道如何完成它。另外它不会自动重新调整操作栏以完全隐藏或显示,但是当用户从屏幕上移开时,操作栏出现在屏幕的一半。请帮我完成这个,我将100%apperciate!

1 个答案:

答案 0 :(得分:1)

如果您想要一个平滑过渡条,您可能希望使用布局(可能是水平线性布局,将内容水平放入操作栏)以及动画/过渡您的自己的自定义操作栏app-header通过设置负边距将其拉出屏幕顶部。 (这是一种具有更多可定制性的替代解决方案。)

这是设置布局边距动画的示例:Change Left Margin Using Animation(您必须将其更改为上边距)

然而,这不会成为&#34;坚持&#34;像你一样的动作栏(它不会在2px或中途停留 等)。实施&#34;坚持&#34;滚动操作栏你想要覆盖ListView或CustomScrollView上的OnScrollListener()并做一些这样的数学运算:

int scrollpos = (int)view.getScrollY();
if(scrollpos<70) { //trigger scroll movement
    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)findViewById(R.id.ListView).getLayoutParams();
    params.topMargin = -scrollpos;
    //if scrollpos = 0, then topMargin will = 0, completely visible.
    //if scroll is past 70, then topMargin will = -70, completely hidden.
    //assuming your action-bar is 70px
    findViewById(R.id.ListView).setLayoutParams(params);
}

您实际上必须通过获取和设置topMargin来设置LayoutParams,我没有将其包括在内。我远离任何Java IDE,所以我现在无法编译代码。

希望这有帮助,