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

Изображение на панели инструментов

Используя последний android.support.v7.widget.Toolbar, я хочу центрировать изображение на панели инструментов, но он остается слева.

Лучший способ для меня - использовать метод toolbar.setLogo() и центрировать логотип, но я не вижу никакого способа сделать это.

Я использую макет для Toolbar:

  <android.support.v7.widget.Toolbar style="@style/ToolBarStyle"
                                   xmlns:android="http://schemas.android.com/apk/res/android"
                                   android:layout_width="match_parent"
                                   android:layout_height="wrap_content"
                                   android:background="?attr/colorPrimary"
                                   android:minHeight="@dimen/abc_action_bar_default_height_material">

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

Есть ли возможность добавить изображение (логотип) на панель инструментов и центрировать его? программно или в макете?

4b9b3361

Ответ 1

Панель инструментов - это только ViewGroup, вы можете настроить столько, сколько хотите.

Попробуйте следующее:

<android.support.v7.widget.Toolbar
   style="@style/ToolBarStyle"
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="?attr/colorPrimary"
   android:minHeight="@dimen/abc_action_bar_default_height_material">

    <ImageView
        android:layout_width="wrap_content"
        android:contentDescription="@string/logo"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/ic_launcher"/>

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

Это должно привести ваше изображениеView в центр панели инструментов.

Ответ 2

Если у вас есть какие-либо взгляды и вы не можете получить логотип с центром, это будет потому, что центрирование основано на оставшемся пространстве, а не на всей панели инструментов.

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

toolbar.xml

<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/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@drawable/toolbar_background"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:layout_scrollFlags="scroll|enterAlways"
    app:layout_collapseMode="pin">
</android.support.v7.widget.Toolbar>

toolbar_background.xml

<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/logo" android:gravity="center" />
  </item>
</layer-list>

Это должно обеспечить центрированный логотип с определенным цветом фона.

Ответ 3

Это не лучшее решение, но это работает, даже если у вас есть кнопка или пункт меню.

попробовать

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
       style="@style/ToolBarStyle"
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:background="?attr/colorPrimary"
       android:minHeight="@dimen/abc_action_bar_default_height_material"/>

    <ImageView
        android:layout_width="wrap_content"
        android:contentDescription="@string/logo"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/ic_launcher"/>

</FrameLayout>

Ответ 4

У меня была аналогичная проблема. Я попытался использовать подкласс слоев, предложенный Черникой, но как только я включил ресурс с высоким разрешением для логотипа, решение больше не работало. У растрового изображения в списке слоев есть ошибка: он будет увеличивать изображения меньшего размера, чтобы они соответствовали пространству, но не уменьшали бы большие изображения. Итак, пока вы в порядке с использованием крошечных изображений, которые выглядят зернистыми/пиксельными при увеличении, список слоев отлично работает.

Чтобы решить эту проблему и иметь центрированный логотип с высоким разрешением, я полностью удалил атрибут android:background с панели инструментов, добавил android:background="?attr/colorPrimary" в мой родительский AppBarLayout, а затем перебросил этот ужасный код в свою активность onCreate метод:

    final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    ActionBar ab = getSupportActionBar();
    if (ab != null && toolbar != null)
    {
        // Hide the title text.
        ab.setDisplayShowTitleEnabled(false);

        // Convert and show the logo.
        toolbar.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)
            {
                ActionBar ab = getSupportActionBar();
                if (ab != null)
                {
                    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.logo);
                    Bitmap bmp2 = Bitmap.createBitmap(toolbar.getWidth(), toolbar.getHeight(), bmp.getConfig());
                    Bitmap bmp3 = Bitmap.createScaledBitmap(bmp, bmp.getWidth() * toolbar.getHeight() / bmp.getHeight(), toolbar.getHeight(), true);
                    Canvas canvas = new Canvas(bmp2);
                    canvas.drawBitmap(bmp3, (toolbar.getWidth() / 2) - (bmp3.getWidth() / 2), 0, null);
                    BitmapDrawable background = new BitmapDrawable(getResources(), bmp2);
                    ab.setBackgroundDrawable(background);
                }
            }
        });
    }

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

С положительной стороны, этот подход дает вам полный контроль над размещением, размером и т.д. Не ограничиваясь тем, что вы можете делать в XML. Это ужасно, потому что это называется довольно регулярно всякий раз, когда меняется макет панели инструментов, что означает, что есть последствия для производительности. Но, когда вам требуется команда дизайнеров (которая не заботится о том, чтобы первое, что касается Material Design) иметь фоновый логотип и тратить пять часов на то, чтобы найти решение выше, производительность перестает иметь значение - вы просто хотите, чтобы эта чертова работа работала. Вышеприведенный код довольно плохо отрывается от отчаяния.

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

Ответ 5

Если вам нужно сосредоточить более сложный макет на панели инструментов, чем просто изображение, это то, что я разместил для своей Activity onCreate():

mToolbar.addOnLayoutChangeListener(
            new View.OnLayoutChangeListener() {
                @Override
                public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
                    // Push layout to the center
                    int toolbarCenterX = (int) (mToolbar.getWidth() / 2.0 - mMiddleToolbarLayout.getWidth() / 2.0));
                    if(mMiddleToolbarLayout.getX() != toolbarCenterX) {
                        mMiddleToolbarLayout.setX(toolbarCenterX);
                    }
                }
            }
    );

Когда вызывается onLayoutChange, ваша ширина макета уже определена, поэтому вы просто нажимаете ее в центр.

ПРИМЕЧАНИЕ. Важно, чтобы только центральная панель инструментов (см. условие if), когда она не центрирована, в противном случае этот обратный вызов будет повторно вызван в бесконечном цикле.

Файл XML будет выглядеть так:

<android.support.v7.widget.Toolbar
...
>
    <LinearLayout
        android:id="@+id/middle_toolbar_layout"
        ...
    >
</android.support.v7.widget.Toolbar>