Как центрировать ImageView на панели инструментов?

Была попытка центрировать логотип внутри моей панели инструментов. Когда я перейду к следующему действию, появится значок "довольный доступ", и он слегка подтолкнет мой логотип вправо. Как я могу сохранить свой логотип в центре панели инструментов, не удаляя значок бесплатного доступа?

Это мой тег панели инструментов

<android.support.v7.widget.Toolbar
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="wrap_content"
android:background="@color/primaryColor"
android:paddingTop="@dimen/app_bar_top_padding"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
app:theme="@style/CustomToolBarTheme">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_android_logo"
    android:layout_gravity="center"
    android:paddingBottom="3dp"/>
 </android.support.v7.widget.Toolbar>

Ответ 1

В javadoc написано:

Один или несколько пользовательских видов. Приложение может добавить произвольные дочерние представления на панель инструментов. Они появятся в этой позиции в макете. Если дочернее представление Toolbar.LayoutParams указывает значение Gravity CENTER_HORIZONTAL, представление будет пытаться центрироваться в пределах доступного пространства, оставшегося на панели инструментов, после того, как будут измерены все другие элементы.

Это означает, что вы не сможете сделать это, если не создадите пользовательскую toolbar или не удалите icon.

Ответ 2

Вы можете сделать это, так как это работает для меня:

<android.support.v7.widget.Toolbar
        android:id="@+id/mainToolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="@dimen/abc_action_bar_default_height_material">

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="center">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/headerLogo"
                android:contentDescription="@string/app_name" />
            </RelativeLayout>

    </android.support.v7.widget.Toolbar>

Ответ 3

Вы можете делать программно, это единственный способ, которым мне удалось полностью центрировать логотип на панели инструментов.

Добавить к вашей деятельности:

@Override
public void onWindowFocusChanged(boolean hasFocus){

    // set toolbar logo to center programmatically
    Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
    ImageView logo = (ImageView) findViewById(R.id.logo);
    int offset = (toolbar.getWidth() / 2) - (logo.getWidth() / 2);
    // set
    logo.setX(offset);

}

и ваш toolbar_main.xml:

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/bg_yellow"
    android:elevation="4dp"
    android:fontFamily="@string/font_family_thin"
    app:contentInsetStartWithNavigation="0dp"
    android:layout_gravity="center_horizontal">

    <TextView
        android:id="@+id/title_toolbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@string/font_family_light"
        android:textColor="@color/text_dark_xxx"
        android:textSize="@dimen/text_default"
        android:layout_centerVertical="true"
        />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/logo"
        android:id="@+id/logo"
        android:paddingTop="5dp" />



</android.support.v7.widget.Toolbar>

Ответ 4

Я немного опаздываю, чтобы ответить на это, но у меня есть замечательное решение

 <android.support.design.widget.AppBarLayout 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="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:contentInsetStart="0dp"
        app:contentInsetEnd="0dp"
        app:popupTheme="@style/AppTheme.PopupOverlay">



    </android.support.v7.widget.Toolbar>
    <RelativeLayout
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="wrap_content">


        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="?attr/actionBarSize"
            android:contentDescription="@string/app_name"
            android:id="@+id/logoImageView"
            android:layout_centerInParent="true"
            android:adjustViewBounds="true"
            android:src="@drawable/toolbar_background" />
    </RelativeLayout>
</FrameLayout>


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

и вот мой toolbar_background.xml drawable

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <solid android:color="@color/colorPrimary" />
    </shape>
</item>
<item>
    <bitmap
        android:src="@drawable/splash" android:gravity="center"
        />
</item>

output here

Ответ 5

Установите изображение в качестве фона панели инструментов, а не как дочерний.

<android.support.v7.widget.Toolbar
    android:id="@+id/detail_toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:background="@drawable/my_image"
    app:theme="@style/CustomToolBarTheme">

Ответ 6

Для разработчиков, которые используют векторные или изображения SVG.
Это может быть ваш фон для панели инструментов, drawable_toolbar_background.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/primary"/>
        </shape>
    </item>
    <item
        android:width="@dimen/toolbar_app_icon_width"
        android:height="@dimen/toolbar_app_icon_height"
        android:drawable="@drawable/ic_app_logo"
        android:gravity="center"/>
</layer-list>

и Да, вы должны исправить ширину и высоту элемента внутри drawable, хотя векторный drawable уже имеет фиксированный размер.
Это ваша панель инструментов,

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/drawable_toolbar_background"
    android:minHeight="?attr/actionBarSize"
    android:theme="?attr/actionBarTheme"/>

Ответ 7

Вам нужно использовать виджет AppBarLayout с виджетом "Панель инструментов" и установить для contentInsetStart значение 0dp. В противном случае на панели инструментов в начале будет примерно 8dp отступа (для вставки кнопок навигации, если это необходимо).

Вот рабочий код:

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

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

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="left"
            android:adjustViewBounds="true"
            android:scaleType="centerInside"
            android:src="@drawable/company_logo" />

    </android.support.v7.widget.Toolbar>


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

Кроме того, убедитесь, что вы используете ?attr/actionBarSize в качестве высоты панели инструментов, так как это высота actionBar по умолчанию, которая будет адаптироваться ко всем разным размерам экрана.

Ответ 8

Самое простое решение, которое работает даже при наличии действий с меню, это:

 <android.support.design.widget.AppBarLayout
    android:id="@+id/apbMain"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/tlbMain"
        android:layout_width="match_parent"
        android:layout_height="?android:actionBarSize"
        app:navigationContentDescription="@null"
        app:title="@null"
        app:subtitle="@null"
        app:popupTheme="@style/AppTheme.PopupOverlay">

            <ImageButton
                android:id="@+id/btnBack"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingTop="12dp"
                android:paddingBottom="12dp"
                android:scaleType="centerInside"
                android:background="@null"
                android:onClick="onBackClickListener"
                android:src="@drawable/ic_navigation_back"
                android:visibility="@{showBackBtn ? View.VISIBLE : View.INVISIBLE}" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:layout_gravity="center"
                android:src="@drawable/toolbar_icon" />

    </android.support.v7.widget.Toolbar>

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

Ответ 9

Я придумал это решение. Поместите свою Toolbar и ImageView в ConstraintLayout и ограничьте все их стороны родителем:

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:navigationIcon="@drawable/icon" />

        <ImageView
            android:layout_width="148dp"
            android:layout_height="@dimen/dim_24x"
            android:contentDescription="@string/accs_label"
            android:src="@drawable/label"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

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

Мне очень трудно центрировать вид внутри самой компоновки панели инструментов, потому что позиция рассчитывается относительно кнопок навигации и пунктов меню. Таким образом, он будет находиться по центру между кнопкой навигации и пунктами меню, а не между фактическим началом и концом панели инструментов.