|
56 | 56 | import androidx.core.graphics.drawable.TintAwareDrawable; |
57 | 57 | import androidx.core.util.ObjectsCompat; |
58 | 58 | import android.util.AttributeSet; |
| 59 | +import android.util.Log; |
59 | 60 | import com.google.android.material.color.MaterialColors; |
60 | 61 | import com.google.android.material.elevation.ElevationOverlayProvider; |
61 | 62 | import com.google.android.material.shadow.ShadowRenderer; |
|
64 | 65 | import com.google.android.material.shape.ShapePath.ShadowCompatOperation; |
65 | 66 | import java.lang.annotation.Retention; |
66 | 67 | import java.lang.annotation.RetentionPolicy; |
| 68 | +import java.util.BitSet; |
67 | 69 |
|
68 | 70 | /** |
69 | 71 | * Base drawable class for Material Shapes that handles shadows, elevation, scale and color for a |
70 | 72 | * generated path. |
71 | 73 | */ |
72 | 74 | public class MaterialShapeDrawable extends Drawable implements TintAwareDrawable, Shapeable { |
73 | 75 |
|
| 76 | + private static final String TAG = MaterialShapeDrawable.class.getSimpleName(); |
| 77 | + |
74 | 78 | private static final float SHADOW_RADIUS_MULTIPLIER = .75f; |
75 | 79 |
|
76 | 80 | private static final float SHADOW_OFFSET_MULTIPLIER = .25f; |
@@ -108,6 +112,7 @@ public class MaterialShapeDrawable extends Drawable implements TintAwareDrawable |
108 | 112 | // Inter-method state. |
109 | 113 | private final ShadowCompatOperation[] cornerShadowOperation = new ShadowCompatOperation[4]; |
110 | 114 | private final ShadowCompatOperation[] edgeShadowOperation = new ShadowCompatOperation[4]; |
| 115 | + private final BitSet containsIncompatibleShadowOp = new BitSet(8); |
111 | 116 | private boolean pathDirty; |
112 | 117 |
|
113 | 118 | // Pre-allocated objects that are re-used several times during path computation and rendering. |
@@ -204,11 +209,13 @@ private MaterialShapeDrawable(@NonNull MaterialShapeDrawableState drawableState) |
204 | 209 | @Override |
205 | 210 | public void onCornerPathCreated( |
206 | 211 | @NonNull ShapePath cornerPath, Matrix transform, int count) { |
| 212 | + containsIncompatibleShadowOp.set(count, cornerPath.containsIncompatibleShadowOp()); |
207 | 213 | cornerShadowOperation[count] = cornerPath.createShadowCompatOperation(transform); |
208 | 214 | } |
209 | 215 |
|
210 | 216 | @Override |
211 | 217 | public void onEdgePathCreated(@NonNull ShapePath edgePath, Matrix transform, int count) { |
| 218 | + containsIncompatibleShadowOp.set(count + 4, edgePath.containsIncompatibleShadowOp()); |
212 | 219 | edgeShadowOperation[count] = edgePath.createShadowCompatOperation(transform); |
213 | 220 | } |
214 | 221 | }; |
@@ -1067,6 +1074,12 @@ private void prepareCanvasForShadow(@NonNull Canvas canvas) { |
1067 | 1074 | * completely covered by the shape. |
1068 | 1075 | */ |
1069 | 1076 | private void drawCompatShadow(@NonNull Canvas canvas) { |
| 1077 | + if (containsIncompatibleShadowOp.cardinality() > 0) { |
| 1078 | + Log.w( |
| 1079 | + TAG, |
| 1080 | + "Compatibility shadow requested but can't be drawn for all operations in this shape."); |
| 1081 | + } |
| 1082 | + |
1070 | 1083 | if (drawableState.shadowCompatOffset != 0) { |
1071 | 1084 | canvas.drawPath(path, shadowRenderer.getShadowPaint()); |
1072 | 1085 | } |
|
0 commit comments