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);