Skip to content

Commit dc91b39

Browse files
pubiqqimhappi
authored andcommittedAug 18, 2023
[Carousel] Update mask size on size change if mask x percentage has been set
Resolves #3450 GIT_ORIGIN_REV_ID=df8a325da6e4a796ab33d93e2ba165e40da8733e Co-authored-by: imhappi PiperOrigin-RevId: 558207460
1 parent 44bfe2d commit dc91b39

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed
 

‎lib/java/com/google/android/material/carousel/MaskableFrameLayout.java

+16-6
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
/** A {@link FrameLayout} than is able to mask itself and all children. */
4141
public class MaskableFrameLayout extends FrameLayout implements Maskable, Shapeable {
4242

43-
private float maskXPercentage = 0F;
43+
private static final int NOT_SET = -1;
44+
45+
private float maskXPercentage = NOT_SET;
4446
private final RectF maskRect = new RectF();
4547
@Nullable private OnMaskChangedListener onMaskChangedListener;
4648
@NonNull private ShapeAppearanceModel shapeAppearanceModel;
@@ -65,7 +67,9 @@ public MaskableFrameLayout(
6567
@Override
6668
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
6769
super.onSizeChanged(w, h, oldw, oldh);
68-
onMaskChanged();
70+
if (maskXPercentage != NOT_SET) {
71+
updateMaskRectForMaskXPercentage();
72+
}
6973
}
7074

7175
@Override
@@ -123,10 +127,16 @@ public void setMaskXPercentage(float percentage) {
123127
percentage = MathUtils.clamp(percentage, 0F, 1F);
124128
if (maskXPercentage != percentage) {
125129
this.maskXPercentage = percentage;
126-
// Translate the percentage into an actual pixel value of how much of this view should be
127-
// masked away.
128-
float maskWidth = AnimationUtils.lerp(0f, getWidth() / 2F, 0f, 1f, maskXPercentage);
129-
setMaskRectF(new RectF(maskWidth, 0F, (getWidth() - maskWidth), getHeight()));
130+
updateMaskRectForMaskXPercentage();
131+
}
132+
}
133+
134+
private void updateMaskRectForMaskXPercentage() {
135+
if (maskXPercentage != NOT_SET) {
136+
// Translate the percentage into an actual pixel value of how much of this view should be
137+
// masked away.
138+
float maskWidth = AnimationUtils.lerp(0f, getWidth() / 2F, 0f, 1f, maskXPercentage);
139+
setMaskRectF(new RectF(maskWidth, 0F, (getWidth() - maskWidth), getHeight()));
130140
}
131141
}
132142

‎lib/javatests/com/google/android/material/carousel/CarouselLayoutManagerRtlTest.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static com.google.common.truth.Truth.assertThat;
2929

3030
import android.content.Context;
31+
import android.graphics.RectF;
3132
import android.os.Build.VERSION_CODES;
3233
import androidx.appcompat.app.AppCompatActivity;
3334
import androidx.recyclerview.widget.RecyclerView;
@@ -107,8 +108,9 @@ public void testScrollBeyondMaxHorizontalScroll_shouldLimitToMaxScrollOffset() t
107108
@Test
108109
public void testSingleItem_shouldBeInFocalRange() throws Throwable {
109110
setAdapterItems(recyclerView, layoutManager, adapter, CarouselHelper.createDataSetWithSize(1));
111+
RectF maskRect = ((Maskable) recyclerView.getChildAt(0)).getMaskRectF();
110112

111-
assertThat(((Maskable) recyclerView.getChildAt(0)).getMaskXPercentage()).isEqualTo(0F);
113+
assertThat((int) (maskRect.right - maskRect.left)).isEqualTo(DEFAULT_ITEM_WIDTH);
112114
}
113115

114116
@Test

‎lib/javatests/com/google/android/material/carousel/CarouselLayoutManagerTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,9 @@ public void testEmptyAdapter_shouldClearAllViewsFromRecyclerView() throws Throwa
254254
@Test
255255
public void testSingleItem_shouldBeInFocalRange() throws Throwable {
256256
setAdapterItems(recyclerView, layoutManager, adapter, createDataSetWithSize(1));
257+
RectF maskRect = ((Maskable) recyclerView.getChildAt(0)).getMaskRectF();
257258

258-
assertThat(((Maskable) recyclerView.getChildAt(0)).getMaskXPercentage()).isEqualTo(0F);
259+
assertThat((int) (maskRect.right - maskRect.left)).isEqualTo(DEFAULT_ITEM_WIDTH);
259260
}
260261

261262
@Test

0 commit comments

Comments
 (0)