2

我一直在玩 AppBarLayout,但我找不到让它的背景透明的方法。

这就是我的意思:

在此处输入图像描述

这是我的 XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:elevation="0dp"
        android:background="@android:color/transparent">

        <TextView
            android:id="@+id/toolbar"
            app:elevation="0dp"
            android:text="hey"
            android:textColor="@android:color/white"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:background="#8000CDFE"
            app:layout_scrollFlags="scroll|enterAlways"/>

    </android.support.design.widget.AppBarLayout>

</android.support.design.widget.CoordinatorLayout>

正如你所看到的,我正在使用颜色#8000CDFE,它应该给我 50% 的透明度,但由于某种原因它没有。我尝试将透明背景设置为 AppBarLayout,但也没有多大帮助。

有人遇到过这个问题吗?无论如何要为 AppBarLayout 及其兄弟姐妹分配透明颜色吗?

谢谢。

4

2 回答 2

6

为什么会发生:

根据文档CoordinateLayout是一种特殊的 a FrameaLayout,因此可以假设覆盖行为就像使用常规一样工作FrameLayout,对吗?但问题是,当它检测到您的 RecyclerView 具有app:layout_behavior="@string/appbar_scrolling_view_behavior标志时,它会做不同的事情。

当它检测到滚动行为时,我假设它执行以下操作(没有查看代码,只是假设):它放置在RecyclerView下面AppBarLayout,但保留其完整高度。发生滚动时,它所做的只是将RecyclerView'translationY 设置为负数,以将其向上移动滚动值。

可能的解决方案:

  1. 将翻译设置RecyclerView为 -appBarHeight。这将使它出现在 appBar 下方。
  2. 通过 appBarHeight增加RecyclerView' 高度。这是为了抵消由 scrollBehavior 引起的 translateY 变化。

例如,您可以这样做:

ViewTreeObserver vto = mRecyclerView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
            mRecyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        } else {
            mRecyclerView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }

        recyclerView.setTranslationY(-appBarHeight);
        recyclerView.getLayoutParams().height = recyclerView.getHeight()+appBarHeight;
    }
});
于 2015-10-13T14:04:13.153 回答
0

这些简单的几行代码就可以解决问题

RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recycler);
AppBarLayout barLayout = (AppBarLayout) findViewById(R.id.appbar);    

mRecyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                mRecyclerView.setTranslationY(-barLayout.getHeight());
                mRecyclerView.getLayoutParams().height = mRecyclerView.getHeight()+barLayout.getHeight();
            }
        });
于 2016-11-04T08:24:59.517 回答