diff --git a/docs/components/TopAppBar.md b/docs/components/TopAppBar.md
index 8d1838bee67..0fc3f802783 100644
--- a/docs/components/TopAppBar.md
+++ b/docs/components/TopAppBar.md
@@ -706,6 +706,13 @@ Element | Attribute | Related meth
**Height** | `app:height` | N/A | `?attr/actionBarSize`
**Overlay window** | `app:windowActionModeOverlay` (in app theme) | N/A | `false`
+#### Toolbar logo attributes
+
+Element | Attribute | Related method(s) | Default value
+--------------------- | -------------------------------------------- | --------------------------------------------------------- | -------------
+**AdjustViewBounds** | `app:logoAdjustViewBounds` | `setLogoAdjustViewBounds`
`isLogoAdjustViewBounds` | `false`
+**ScaleType** | `app:logoScaleType` | `setLogoScaleType`
`getLogoScaleType` | ImageView's default
+
#### Styles
Element | Style
diff --git a/lib/java/com/google/android/material/appbar/MaterialToolbar.java b/lib/java/com/google/android/material/appbar/MaterialToolbar.java
index 0a1fdffd4cd..cbd327ee67c 100644
--- a/lib/java/com/google/android/material/appbar/MaterialToolbar.java
+++ b/lib/java/com/google/android/material/appbar/MaterialToolbar.java
@@ -32,6 +32,8 @@
import android.util.AttributeSet;
import android.util.Pair;
import android.view.View;
+import android.view.View.MeasureSpec;
+import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
@@ -69,10 +71,24 @@ public class MaterialToolbar extends Toolbar {
private static final int DEF_STYLE_RES = R.style.Widget_MaterialComponents_Toolbar;
+ private static final ImageView.ScaleType[] LOGO_SCALE_TYPE_ARRAY = {
+ ImageView.ScaleType.MATRIX,
+ ImageView.ScaleType.FIT_XY,
+ ImageView.ScaleType.FIT_START,
+ ImageView.ScaleType.FIT_CENTER,
+ ImageView.ScaleType.FIT_END,
+ ImageView.ScaleType.CENTER,
+ ImageView.ScaleType.CENTER_CROP,
+ ImageView.ScaleType.CENTER_INSIDE
+ };
+
@Nullable private Integer navigationIconTint;
private boolean titleCentered;
private boolean subtitleCentered;
+ @Nullable private ImageView.ScaleType logoScaleType;
+ @Nullable private Boolean logoAdjustViewBounds;
+
public MaterialToolbar(@NonNull Context context) {
this(context, null);
}
@@ -97,6 +113,15 @@ public MaterialToolbar(@NonNull Context context, @Nullable AttributeSet attrs, i
titleCentered = a.getBoolean(R.styleable.MaterialToolbar_titleCentered, false);
subtitleCentered = a.getBoolean(R.styleable.MaterialToolbar_subtitleCentered, false);
+ final int index = a.getInt(R.styleable.MaterialToolbar_logoScaleType, -1);
+ if (index >= 0 && index < LOGO_SCALE_TYPE_ARRAY.length) {
+ logoScaleType = LOGO_SCALE_TYPE_ARRAY[index];
+ }
+
+ if (a.hasValue(R.styleable.MaterialToolbar_logoAdjustViewBounds)) {
+ logoAdjustViewBounds = a.getBoolean(R.styleable.MaterialToolbar_logoAdjustViewBounds, false);
+ }
+
a.recycle();
initBackground(context);
@@ -107,6 +132,7 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto
super.onLayout(changed, left, top, right, bottom);
maybeCenterTitleViews();
+ updateLogoImageView();
}
private void maybeCenterTitleViews() {
@@ -178,6 +204,54 @@ private void layoutTitleCenteredHorizontally(
titleView.layout(titleLeft, titleView.getTop(), titleRight, titleView.getBottom());
}
+ private void updateLogoImageView() {
+ ImageView logoImageView = ToolbarUtils.getLogoImageView(this);
+
+ if (logoImageView != null) {
+ if (logoAdjustViewBounds != null) {
+ logoImageView.setAdjustViewBounds(logoAdjustViewBounds);
+ }
+ if (logoScaleType != null) {
+ logoImageView.setScaleType(logoScaleType);
+ }
+ }
+ }
+
+ /**
+ * Returns scale type of logo's ImageView
+ *
+ * @see #setLogoScaleType(ImageView.ScaleType). Default - null
+ */
+ @Nullable
+ public ImageView.ScaleType getLogoScaleType() {
+ return logoScaleType;
+ }
+
+ /** Sets ImageView.ScaleType for logo's ImageView. */
+ public void setLogoScaleType(@NonNull ImageView.ScaleType logoScaleType) {
+ if (this.logoScaleType != logoScaleType) {
+ this.logoScaleType = logoScaleType;
+ requestLayout();
+ }
+ }
+
+ /**
+ * Returns logo's ImageView adjustViewBounds
+ *
+ * @see #setLogoAdjustViewBounds(boolean). Default - false
+ */
+ public boolean isLogoAdjustViewBounds() {
+ return logoAdjustViewBounds != null && logoAdjustViewBounds;
+ }
+
+ /** Sets ImageView.adjustViewBounds for logo's ImageView. */
+ public void setLogoAdjustViewBounds(boolean logoAdjustViewBounds) {
+ if (this.logoAdjustViewBounds == null || this.logoAdjustViewBounds != logoAdjustViewBounds) {
+ this.logoAdjustViewBounds = logoAdjustViewBounds;
+ requestLayout();
+ }
+ }
+
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
diff --git a/lib/java/com/google/android/material/appbar/res-public/values/public.xml b/lib/java/com/google/android/material/appbar/res-public/values/public.xml
index 679c017c2c1..c302eb3d807 100644
--- a/lib/java/com/google/android/material/appbar/res-public/values/public.xml
+++ b/lib/java/com/google/android/material/appbar/res-public/values/public.xml
@@ -85,5 +85,7 @@
+
+
diff --git a/lib/java/com/google/android/material/appbar/res/values/attrs.xml b/lib/java/com/google/android/material/appbar/res/values/attrs.xml
index 0bdf75ff604..11b70d395d7 100644
--- a/lib/java/com/google/android/material/appbar/res/values/attrs.xml
+++ b/lib/java/com/google/android/material/appbar/res/values/attrs.xml
@@ -276,6 +276,33 @@
should be centered horizontally within the toolbar. Default is false.
-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/java/com/google/android/material/internal/ToolbarUtils.java b/lib/java/com/google/android/material/internal/ToolbarUtils.java
index 51da3abdc14..b62497d1b1f 100644
--- a/lib/java/com/google/android/material/internal/ToolbarUtils.java
+++ b/lib/java/com/google/android/material/internal/ToolbarUtils.java
@@ -23,6 +23,7 @@
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageButton;
+import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
@@ -66,6 +67,27 @@ private static TextView getTextView(@NonNull Toolbar toolbar, CharSequence text)
return null;
}
+ @Nullable
+ public static ImageView getLogoImageView(@NonNull Toolbar toolbar) {
+ return getImageView(toolbar, toolbar.getLogo());
+ }
+
+ @Nullable
+ private static ImageView getImageView(@NonNull Toolbar toolbar, @Nullable Drawable content) {
+ for (int i = 0; i < toolbar.getChildCount(); i++) {
+ View child = toolbar.getChildAt(i);
+ if (child instanceof ImageView) {
+ ImageView imageView = (ImageView) child;
+ if (content != null
+ && imageView.getDrawable().getConstantState().equals(content.getConstantState())
+ ) {
+ return imageView;
+ }
+ }
+ }
+ return null;
+ }
+
@Nullable
public static View getSecondaryActionMenuItemView(@NonNull Toolbar toolbar) {
ActionMenuView actionMenuView = getActionMenuView(toolbar);