diff --git a/lib/java/com/google/android/material/chip/Chip.java b/lib/java/com/google/android/material/chip/Chip.java index 5178ec8b3..e42441d2c 100644 --- a/lib/java/com/google/android/material/chip/Chip.java +++ b/lib/java/com/google/android/material/chip/Chip.java @@ -277,10 +277,6 @@ public class Chip extends AppCompatCheckBox implements Delegate, Shapeable { } } - private boolean shouldEnsureMinTouchTargetSize() { - return ensureMinTouchTargetSize; - } - private void initMinTouchTarget(Context context, AttributeSet attrs, int defStyleAttr) { if (attrs == null) { return; @@ -2257,7 +2253,7 @@ public class Chip extends AppCompatCheckBox implements Delegate, Shapeable { * @see #setEnsureMinTouchTargetSize(boolean) * @attr ref com.google.android.material.R.styleable#Chip_ensureMinTouchTargetSize */ - public boolean getEnsureMinTouchTargetSize() { + public boolean shouldEnsureMinTouchTargetSize() { return ensureMinTouchTargetSize; } diff --git a/lib/java/com/google/android/material/chip/res/values/attrs.xml b/lib/java/com/google/android/material/chip/res/values/attrs.xml index db8694daf..3c2fde467 100644 --- a/lib/java/com/google/android/material/chip/res/values/attrs.xml +++ b/lib/java/com/google/android/material/chip/res/values/attrs.xml @@ -41,7 +41,7 @@ - + diff --git a/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButton.java b/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButton.java index ef6c4dbce..5019db49f 100644 --- a/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButton.java +++ b/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButton.java @@ -236,6 +236,9 @@ public class FloatingActionButton extends VisibilityAwareImageButton new ShapeAppearanceModel(context, attrs, defStyleAttr, DEF_STYLE_RES, -1); boolean usingDefaultCorner = isUsingDefaultCorner(shapeAppearance); + boolean ensureMinTouchTargetSize = a + .getBoolean(R.styleable.FloatingActionButton_ensureMinTouchTargetSize, false); + a.recycle(); imageHelper = new AppCompatImageHelper(this); @@ -252,6 +255,7 @@ public class FloatingActionButton extends VisibilityAwareImageButton getImpl().setMaxImageSize(maxImageSize); getImpl().setShowMotionSpec(showMotionSpec); getImpl().setHideMotionSpec(hideMotionSpec); + getImpl().setEnsureMinTouchTargetSize(ensureMinTouchTargetSize); setScaleType(ScaleType.MATRIX); } @@ -514,6 +518,31 @@ public class FloatingActionButton extends VisibilityAwareImageButton return checkNotNull(getImpl().getShapeAppearance()); } + /** + * Returns whether this fab will expand its bounds (if needed) to meet the minimum touch target + * size. + * + * @see #setEnsureMinTouchTargetSize(boolean) + * @attr ref com.google.android.material.R.styleable#FloatingActionButton_ensureMinTouchTargetSize + */ + public boolean shouldEnsureMinTouchTargetSize() { + return getImpl().getEnsureMinTouchTargetSize(); + } + + /** + * Sets whether this FloatingActionButton should expand its bounds (if needed) to meet the minimum + * touch target size. + * + * @attr ref com.google.android.material.R.styleable#FloatingActionButton_ensureMinTouchTargetSize + */ + public void setEnsureMinTouchTargetSize(boolean flag) { + if (flag != getImpl().getEnsureMinTouchTargetSize()) { + getImpl().setEnsureMinTouchTargetSize(flag); + requestLayout(); + } + } + + @Override public void setVisibility(int visibility) { super.setVisibility(visibility); diff --git a/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButtonImpl.java b/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButtonImpl.java index 59deeff0e..b0ba47a27 100644 --- a/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButtonImpl.java +++ b/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButtonImpl.java @@ -83,6 +83,7 @@ class FloatingActionButtonImpl { @Nullable Drawable contentBackground; boolean usingDefaultCorner; + boolean ensureMinTouchTargetSize; float elevation; float hoveredFocusedTranslationZ; float pressedTranslationZ; @@ -341,8 +342,16 @@ class FloatingActionButtonImpl { hideMotionSpec = spec; } - final boolean isAccessible() { - return view.getSizeDimension() >= minTouchTargetSize; + final boolean shouldExpandBoundsForA11y() { + return !ensureMinTouchTargetSize || view.getSizeDimension() >= minTouchTargetSize; + } + + boolean getEnsureMinTouchTargetSize() { + return ensureMinTouchTargetSize; + } + + void setEnsureMinTouchTargetSize(boolean flag) { + ensureMinTouchTargetSize = flag; } void onElevationsChanged( @@ -641,7 +650,10 @@ class FloatingActionButtonImpl { } void getPadding(Rect rect) { - final int minPadding = (minTouchTargetSize - view.getSizeDimension()) / 2; + final int minPadding = ensureMinTouchTargetSize + ? (minTouchTargetSize - view.getSizeDimension()) / 2 + : 0; + final float maxShadowSize = (getElevation() + pressedTranslationZ); final int hPadding = Math.max(minPadding, (int) Math.ceil(maxShadowSize)); final int vPadding = Math.max(minPadding, (int) Math.ceil(maxShadowSize * SHADOW_MULTIPLIER)); diff --git a/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButtonImplLollipop.java b/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButtonImplLollipop.java index 65ac91870..a2387bd9d 100644 --- a/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButtonImplLollipop.java +++ b/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButtonImplLollipop.java @@ -173,7 +173,7 @@ class FloatingActionButtonImplLollipop extends FloatingActionButtonImpl { @Override boolean shouldAddPadding() { - return shadowViewDelegate.isCompatPaddingEnabled() || !isAccessible(); + return shadowViewDelegate.isCompatPaddingEnabled() || !shouldExpandBoundsForA11y(); } @Override @@ -236,7 +236,7 @@ class FloatingActionButtonImplLollipop extends FloatingActionButtonImpl { void getPadding(Rect rect) { if (shadowViewDelegate.isCompatPaddingEnabled()) { super.getPadding(rect); - } else if (!isAccessible()) { + } else if (!shouldExpandBoundsForA11y()) { int minPadding = (minTouchTargetSize - view.getSizeDimension()) / 2; rect.set(minPadding, minPadding, minPadding, minPadding); } else { diff --git a/lib/java/com/google/android/material/floatingactionbutton/res/values/attrs.xml b/lib/java/com/google/android/material/floatingactionbutton/res/values/attrs.xml index 25e69ce09..7897fad54 100644 --- a/lib/java/com/google/android/material/floatingactionbutton/res/values/attrs.xml +++ b/lib/java/com/google/android/material/floatingactionbutton/res/values/attrs.xml @@ -36,6 +36,9 @@ + + diff --git a/lib/java/com/google/android/material/floatingactionbutton/res/values/styles.xml b/lib/java/com/google/android/material/floatingactionbutton/res/values/styles.xml index 23b653cb7..4e9503d47 100644 --- a/lib/java/com/google/android/material/floatingactionbutton/res/values/styles.xml +++ b/lib/java/com/google/android/material/floatingactionbutton/res/values/styles.xml @@ -35,6 +35,7 @@