如何使ActionBar像Google Play一样在滚动时渐隐


72

如何使透明或半透明的ActionBar(如Google Play)在使用滚动时淡入或淡出windowActionBarOverlay

查看以下屏幕截图

**在此处输入图片说明**


1
您能否详细说明“不起作用”,是否有错误,意外结果?AVD还是真实设备?
RossC 2014年

勾选此[ObservableScrollView] [1]它应该帮助你[1]:stackoverflow.com/questions/27685847/...
阿里·努尔丁

这个链接对我很有帮助github.com/ManuelPeinado/FadingActionBar。可能对其他人有帮助!
Amrut Bidri

Answers:


32

以下是我正在使用的应用程序中使用的代码

您将必须在中使用该OnScrollChanged功能ScrollViewActionBar不允许您设置不透明度,因此请在操作栏上设置背景可绘制,然后可以基于滚动视图中的滚动量更改其不透明度。我给了一个示例工作流程

函数集根据其位置WRT窗口为视图locationImage提供适当的Alpha。

this.getScrollY()给你scrollView滚动了多少

public void OnScrollChanged(int l, int t, int oldl, int oldt) {
    // Code ...
    locationImage.setAlpha(getAlphaForView(locationImageInitialLocation- this.getScrollY()));
}


private float getAlphaForView(int position) {
    int diff = 0;
    float minAlpha = 0.4f, maxAlpha = 1.f;
    float alpha = minAlpha; // min alpha
    if (position > screenHeight)
        alpha = minAlpha;
    else if (position + locationImageHeight < screenHeight)
        alpha = maxAlpha;
    else {
        diff = screenHeight - position;
        alpha += ((diff * 1f) / locationImageHeight)* (maxAlpha - minAlpha); // 1f and 0.4f are maximum and min
                                            // alpha
        // this will return a number betn 0f and 0.6f
    }
    // System.out.println(alpha+" "+screenHeight +" "+locationImageInitialLocation+" "+position+" "+diff);
    return alpha;
}

编辑:我在https://github.com/ramanadv/fadingActionBar上添加了一个示例工作示例,您可以看一下。

在此处输入图片说明


2
我试图在github.com/ramanadv/fadingActionBar上运行示例工作示例。但是输出与您的屏幕截图不同。正在显示透明的操作栏。无褪色效果!
Vivek Warde 2014年

您尝试在哪个设备上运行它以及哪个android版本?
CommandSpace 2014年

我认为setOnScrollChange可在API 23+上使用
Ahmad Behzadi

有没有人表示这是一种行为?
QED



7

官方Google DeveloperDocumentation

在此处输入图片说明

叠加模式下的操作栏。

启用覆盖模式

要为操作栏启用叠加模式,您需要创建一个自定义主题,以扩展现有的操作栏主题,并将android:windowActionBarOverlay属性设置为true。

仅适用于Android 3.0及更高版本

如果您的minSdkVersion设置为11或更高,则自定义主题应使用Theme.Holo主题(或其后代之一)作为父主题。例如:

<resources>
    <!-- the theme applied to the application or activity -->
    <style name="CustomActionBarTheme"
           parent="@android:style/Theme.Holo">
        <item name="android:windowActionBarOverlay">true</item>
    </style>
</resources>

对于Android 2.1及更高版本

如果您的应用程序使用支持库来兼容运行低于Android 3.0的版本的设备,则自定义主题应使用Theme.AppCompat主题(或其子孙之一)作为父主题。例如:

<resources>
    <!-- the theme applied to the application or activity -->
    <style name="CustomActionBarTheme"
           parent="@android:style/Theme.AppCompat">
        <item name="android:windowActionBarOverlay">true</item>

        <!-- Support library compatibility -->
        <item name="windowActionBarOverlay">true</item>
    </style>
</resources>

指定版面的上边距

当操作栏处于叠加模式时,它可能会使您应保持可见的某些布局模糊。为确保此类项目始终保持在操作栏下方,请使用actionBarSize指定的高度在视图顶部添加边距或填充。例如:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="?android:attr/actionBarSize">
    ...
</RelativeLayout>


3

如果在布局xml中使用CoordinatorLayout,则应查看本文,该文章描述如何处理滚动并使其他视图对此滚动做出反应。

有一个示例可以满足您的要求,如果将imageview作为CollapsingToolbarLayout的子级添加,则所有魔术都会自动处理,甚至可以使用一些参数,例如稀松布颜色,开始折叠的最小高度等:


1
该链接正是我想要的。我的工具栏没有与NestedScrollView同步滚动,但是添加app:layout_behavior="@string/appbar_scrolling_view_behavior"到NestedScrollView可以达到目的!
rjr-apps

0

使用AbsListView滚动侦听器,我们可以简单地实现listview,而无需使用其他复杂的库或ScrollView

将滚动侦听器设置为列表视图

public class PagedScrollListener implements AbsListView.OnScrollListener {
    private ActionBar mActionBar;
    private View mTopHideView; // represent header view

     @Override
    public void onScrollStateChanged(final AbsListView view, final int scrollState) {
        mScrollState = scrollState;
    }

    @Override
    public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) {

        if (mActionBar != null && mTopHideView != null && mListView != null) {
            Log.i(TAG, getScrollY() + "");
            int currentY = getScrollY();

            final int headerHeight = mTopHideView.getHeight() - mActionBar.getHeight();
            final float ratio = (float) Math.min(Math.max(currentY, 0), headerHeight) / headerHeight;
            final int newAlpha = (int) (ratio * 255);
            Log.i(TAG, newAlpha + " alpha");
            mActionBarDrawaqble.setAlpha(newAlpha);
}}


public void setActionBarRefernce(ActionBar actionBar, View topHideView, float actionBarHeight, ListView listView) {
        mActionBar = actionBar;
        mActionBarHeight = actionBarHeight;
        mTopHideView = topHideView;
        mListView = listView;
        mActionBarDrawaqble = new ColorDrawable(ContextCompat.getColor(mContext, R.color.google_plus_red));
        mActionBar.setBackgroundDrawable(mActionBarDrawaqble);
        mActionBarDrawaqble.setAlpha(0);
    }

   public int getScrollY() {
        View c = mListView.getChildAt(0);
        if (c == null) {
            return 0;
        }

        int firstVisiblePosition = mListView.getFirstVisiblePosition();
        int top = c.getTop();

        int headerHeight = 0;
        if (firstVisiblePosition >= 1) {
            headerHeight = mTopHideView.getHeight();
        }

        return -top + firstVisiblePosition * c.getHeight() + headerHeight;
    }

} 

//注意:不要忘记调用自定义侦听器的** setActionBarRefernce方法**


-6

在webView上:

@JavascriptInterface
public void showToolbar(String scrollY, String imgWidth) {
    int int_scrollY = Integer.valueOf(scrollY);
    int int_imgWidth = Integer.valueOf(imgWidth);

    String clr;
    if (int_scrollY<=int_imgWidth-actionBarHeight) {
        clr = Integer.toHexString(int_scrollY * 255 / (int_imgWidth-actionBarHeight));
    }else{
        clr = Integer.toHexString(255);
    }

    toolbar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#"+clr+"9CCC65")));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.