CollapsingToolbarLayout открывается с минимальной высотой, когда заголовок изображения содержит большое изображение

У меня есть сворачивающаяся панель инструментов. Мне нужна такая же функциональность, как [Установить начальную высоту CollapsingToolbarLayout. Я пробовал тот же код, что и здесь, но не нашел решения.

Я использую компиляцию SDK версии 26.

Кто-нибудь реализовал то же самое или может помочь мне найти решение?

<android.support.constraint.ConstraintLayout 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"
    tools:context="test_scroll.com.testscroll.MainActivity">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/llmain_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:fitsSystemWindows="true">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsing_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:expandedTitleMarginEnd="64dp"
                app:expandedTitleMarginStart="16dp"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">

                <ImageView
                    android:id="@+id/img_user_photo"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:fitsSystemWindows="true"
                    android:maxHeight="256dp"
                    android:src="@drawable/img1"
                    app:layout_collapseMode="parallax" />


                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin"
                    app:layout_scrollFlags="scroll|enterAlways"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />


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

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

        <android.support.v4.widget.NestedScrollView
            android:id="@+id/nested"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">


            <LinearLayout
                android:id="@+id/llMainNested"
                android:layout_width="match_parent"
                android:layout_height="1000dp"
                android:orientation="vertical">


            </LinearLayout>

        </android.support.v4.widget.NestedScrollView>


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

</android.support.constraint.ConstraintLayout>

onCreate активности

mCoordinatorLayour = (CoordinatorLayout) findViewById(R.id.llmain_content);
        mAppBarLayout = (AppBarLayout) findViewById(R.id.appbar);

        mAppBarLayout.post(new Runnable() {
            @Override
            public void run() {
                int heightPx = findViewById(R.id.img_user_photo).getHeight();
                setAppBarOffset(heightPx/2);
            }
        });


private void setAppBarOffset(int offsetPx){
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
        AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
//        behavior.onNestedPreScroll(mCoordinatorLayour, mAppBarLayout, null, 0, offsetPx, new int[]{0, 0});
        if(behavior!=null)
        behavior.onNestedPreScroll(mCoordinatorLayour, mAppBarLayout, null, 0, offsetPx, new int[]{0, 0}, 1);
        else
            Log.i("TAG", "setAppBarOffset: null");
    }

person hemi_p    schedule 23.03.2018    source источник
comment
что ты уже испробовал? Было бы полезно, если бы вы разместили код, который можно воспроизвести.   -  person DSLima90    schedule 23.03.2018
comment
Я добавил свой xml-код и код активности. Пожалуйста, проверьте мое отредактированное сообщение. img1 — изображение размером 700x933 px.   -  person hemi_p    schedule 24.03.2018


Ответы (2)


<RelativeLayout 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.support.design.widget.CoordinatorLayout
        android:id="@+id/llmain_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorAccent"
            android:fitsSystemWindows="true"
            android:theme="@style/AppTheme">


            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsing_toolbar"
                android:layout_width="match_parent"
                android:layout_height="150dp"
                android:fitsSystemWindows="true"
                app:contentScrim="@color/colorAccent"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">


                <ImageView
                    android:id="@+id/img_user_photo"
                    android:layout_width="match_parent"
                    android:layout_height="150dp"
                    android:fitsSystemWindows="true"
                    android:scaleType="centerCrop"
                    android:src="@drawable/meeting_bg"
                    app:layout_collapseMode="parallax" />

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    android:background="@android:color/transparent"
                    app:contentInsetStartWithNavigation="0dp"
                    app:contentInsetStart="0dp"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

                <include
                    layout="@layout/widget_header_view_top"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:visibility="gone" />
                </android.support.v7.widget.Toolbar>


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

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

        <android.support.v4.widget.NestedScrollView
            android:id="@+id/nested"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">


            <LinearLayout
                android:id="@+id/llMainNested"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">


            </LinearLayout>

        </android.support.v4.widget.NestedScrollView>


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

</RelativeLayout>

Для настройки заголовка панели инструментов и подзаголовка при сворачивании... Я использовал макет, который я включил в панель инструментов...проверьте xml... "widget_header_view_top" Вы можете настроить в соответствии с вашими потребностями.....

Java-класс:

 setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_nav_white);
    getSupportActionBar().setTitle("");
    collapsing_toolbar.setTitle(" ");

appbar.addOnOffsetChangedListener(this);

 @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        int maxScroll = appBarLayout.getTotalScrollRange();
        float percentage = (float) Math.abs(verticalOffset) / (float) maxScroll;

        if (percentage >= 0.6f && isHideToolbarView) {
            toolbarHeaderView.setVisibility(View.VISIBLE);
            if (menuItemEdit != null) {
                //   menuItemEdit.setIcon(R.drawable.edit_white);
            }
            isHideToolbarView = !isHideToolbarView;

        } else if (percentage < 0.6f && !isHideToolbarView) {
            if (menuItemEdit != null) {
                //menuItemEdit.setIcon(R.drawable.edit);
            }
            toolbarHeaderView.setVisibility(View.GONE);
            isHideToolbarView = !isHideToolbarView;
        }
    }
person Pragya Mendiratta    schedule 24.03.2018
comment
Я хочу, чтобы панель инструментов открывалась на определенной высоте, например, 200 пикселей. Не могли бы вы объяснить, как я могу добиться этого с помощью этого кода. - person hemi_p; 24.03.2018

Я получил ответ методом проб и ошибок с приведенным выше кодом метода setAppBarOffset. В этом методе я устанавливал смещение, которое я хочу видеть при загрузке страницы. Вместо этого нам нужно передать смещение, которое нам нужно скрыть. Поэтому я добавил ниже код, чтобы при создании изображения оставалось видимым 256 пикселей.

public static int getDeviceHeight(Context context) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    int height = metrics.heightPixels;

    Rect rectgle = new Rect();
    Window window = ((Activity) context).getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
    int StatusBarHeight = rectgle.top;
    height = height - StatusBarHeight;
    return height;
}



public static int getMinHeightOfAppbar(int device_height,int view_height){
    int offsetPx = (int) (device_height * 0.45);
    offsetPx = view_height - offsetPx;
    return offsetPx;
}

int device_height = Utility.getDeviceHeight(ProfileSettingsNew.this);
offsetPx= Utility.getMinHeightOfAppbar( device_height,imgv_user_photo.getHeight());

setAppBarOffset(offsetPx);
person hemi_p    schedule 26.03.2018