Подтвердить что ты не робот

Наложение содержимого выше AppBarLayout с использованием нового дизайна материалов

Я хочу добиться чего-то подобного. (а не FAB или Snackbar). Как я могу создать макет, наложенный на AppBarLayout? Как это! (Для примера)

AppBarLayout with overlaying content

Как Play Store:

Just like on the Play Store

My AppBarLayout с координаторомLayout и NestedScrollView с RelativeLayout, поскольку содержимое выглядит следующим образом:

<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:id="@+id/rootLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="@dimen/_118sdp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsingToolbarLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:contentScrim="@color/mpc_pink"
        app:expandedTitleMarginStart="@dimen/_40sdp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <de.mypostcardstore.widgets.ItemImageView
            android:id="@+id/header"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:src="@color/mpc_pink"
            app:layout_collapseMode="parallax"
            app:layout_collapseParallaxMultiplier="0.7" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/article_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:minHeight="?attr/actionBarSize"
            app:contentScrim="@color/mpc_pink"
            app:layout_collapseMode="pin"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />


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

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

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:colorBackground"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <RelativeLayout
        android:layout_width="match_parent".....>

Было бы здорово, если бы кто-нибудь мог мне помочь. Я ничего не могу найти в Интернете...

Спасибо заранее!

4b9b3361

Ответ 1

Просто добавьте что-то вроде

app:behavior_overlapTop="64dp"

в NestedScrollView, и он будет размещен над расширенной панелью инструментов.

Кроме того, вы должны добавить что-то вроде

app:expandedTitleMarginBottom="70dp"

на CollapsingToolbarLayout, чтобы заголовок не отображался в вашем наложенном содержании прокрутки.

Ответ 2

Это довольно просто, на самом деле. Вы могли бы достичь этого, используя комбинацию ToolBar, FrameLayout и ваш контент (может быть ListView как ваш первый пример или что-то еще).

Идея состоит в том, чтобы ваш FrameLayout обладал тем же цветом, что и ваш ToolBar, что придает иллюзии ToolBar намного больше, чем есть. Затем все, что вам нужно сделать, - сделать ваш контентный вид последним (или в API 21 и выше: иметь самый высокий атрибут elevation), чтобы он выглядел так, как будто он плавает над вышеупомянутым FrameLayout.

Смотрите рисунок ниже:

enter image description here

Теперь, когда вы получили большую идею, ниже приведен фрагмент реального XML-фрагмента для этого. (Я использую этот макет в одном из моих приложений):

<!-- Somewhere in your layout.xml -->

....

    <android.support.v7.widget.Toolbar
        android:id="@+id/tb_toolbar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/abc_action_bar_default_height_material"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        app:contentInsetStart="72dp"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

    <!-- This is the 'faux' ToolBar I've been telling you about. This is the part that will be overlaid by the content view below. -->
    <FrameLayout
        android:id="@+id/v_toolbar_extension"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:layout_below="@+id/tb_toolbar"
        android:background="?attr/colorPrimary"
        android:elevation="2dp"/>

    <!-- Normally, I use this FrameLayout as a base for inflating my fragments. You could just use put your content view here. -->
    <FrameLayout
        android:id="@+id/ly_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/tb_toolbar"
        android:elevation="3dp"/>

....

Обратите внимание, что мой ly_content имеет более высокое значение высоты, чем значение v_toolbar_extension. Вот что даст вам желаемый эффект "наложенной панели инструментов".

И последнее, но не менее важное: вы хотели бы добавить эту строку где-то в своей деятельности onCreate():

/* Assuming mToolbar exists as a reference to your ToolBar in XML. */
setSupportActionBar(mTbToolbar);
getSupportActionBar().setElevation(0);

Что это за коды, нужно установить нулевое значение ToolBar; удаление предустановленных теней, которые были заданы по умолчанию для ToolBars. Если вы этого не сделаете, тень создаст "шов" между вашим ToolBar и вашим FrameLayout, тем самым нарушив иллюзию того, что эти два являются одинаковыми.

p.s.. Также важно дать вашему контенту представление дополнений с каждой стороны. Таким образом, просмотр содержимого не будет охватывать всю ширину экрана (что сделало бы этот эффект бесполезным).


Примечание: Я вижу здесь несколько хороших ответов, в которых упоминается отсутствие FrameLayout и вместо этого <<20 > выше. Хотя теоретически это может работать так же хорошо, как и мое предложенное решение, у вас могут возникнуть проблемы при попытке манипулировать прокруткой; сделав это, вы не сможете отделить ToolBar и его расширение. Вы будете вынуждены либо сделать статику ToolBar, либо полностью прокрутить все ToolBar (делает прокрутку немного странной).

Добавьте к этому тот факт, что вы не можете легко назначить настраиваемый элемент в ToolBar. Следовательно, трудно следовать примеру Google Play, который вы указали выше. Хотя, если вы используете мое решение, все, что вам нужно сделать, это просто сделать ваш ToolBar прозрачным и назначить вместо него FrameLayout.

Ответ 3

Я попытался реализовать такие эффекты, как вы сказали, которые называются Card Toolbar in Android, и он работал так, как ожидалось. Вот мой макет, Посмотрите на него:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background_material_light" >
<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="@dimen/toolbar_double_height"
    android:background="?attr/colorPrimary" />
<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="@dimen/cardview_toolbar_spacer"
    android:layout_marginRight="@dimen/cardview_toolbar_spacer"
    android:layout_marginTop="?attr/actionBarSize"
    app:cardBackgroundColor="@android:color/white">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <android.support.v7.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize" />
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:alpha="0.12"
            android:background="@android:color/black" />
    </LinearLayout>
</android.support.v7.widget.CardView>
</FrameLayout>

Надеюсь, ты будешь вдохновлен.

Ответ 4

У меня было аналогичное требование, и я достиг этого, как показано ниже.

Тема вашей деятельности должна расширять Theme.AppCompat.Light.NoActionBar. Я создал XML файл Layout как:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_main"
    android:layout_width="match_parent"
    android:layout_height="@dimen/action_bar_size_x2"
    android:background="@color/colorPrimary"
    android:minHeight="?attr/actionBarSize" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="15dp"
    android:layout_marginRight="15dp"
    android:layout_marginTop="@dimen/action_bar_size"
    android:orientation="vertical" >

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:text="@string/app_name"
                android:textSize="24sp" />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

И действие должно быть примерно таким:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar maintoolbar = (Toolbar) findViewById(R.id.toolbar_main);
        setSupportActionBar(maintoolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

У меня было такое мнение: enter image description here