From 1664a829eb08dd5c0f567f6466368ef1d1895e36 Mon Sep 17 00:00:00 2001 From: Teng-Hui Zhu Date: Fri, 4 Mar 2016 15:08:00 -0800 Subject: [PATCH] Add tileMode support into GradientColor So VectorDrawable can have tileMode supported Gradient color. b/27126035 Change-Id: Icbf5983be165f04dc640627f6208fb1292f15625 --- core/java/android/content/res/GradientColor.java | 66 +++++++++++++++- core/res/res/values/attrs.xml | 2 + .../res/color/fill_gradient_linear_clamp.xml | 30 +++++++ .../fill_gradient_linear_item_overlap_mirror.xml | 34 ++++++++ .../res/color/fill_gradient_linear_item_repeat.xml | 33 ++++++++ .../res/color/fill_gradient_radial_clamp.xml | 28 +++++++ .../res/color/fill_gradient_radial_item.xml | 2 +- .../res/color/fill_gradient_radial_item_repeat.xml | 31 ++++++++ .../res/color/fill_gradient_radial_item_short.xml | 2 +- .../fill_gradient_radial_item_short_mirror.xml | 27 +++++++ .../res/color/fill_gradient_sweep_clamp.xml | 28 +++++++ .../color/fill_gradient_sweep_item_long_mirror.xml | 31 ++++++++ .../res/color/fill_gradient_sweep_item_repeat.xml | 31 ++++++++ .../res/color/stroke_gradient_clamp.xml | 30 +++++++ .../color/stroke_gradient_item_alpha_mirror.xml | 29 +++++++ .../res/color/stroke_gradient_item_repeat.xml | 33 ++++++++ .../res/drawable/vector_icon_gradient_1_clamp.xml | 91 ++++++++++++++++++++++ .../res/drawable/vector_icon_gradient_2_repeat.xml | 90 +++++++++++++++++++++ .../res/drawable/vector_icon_gradient_3_mirror.xml | 90 +++++++++++++++++++++ .../test/dynamic/VectorDrawablePerformance.java | 3 + 20 files changed, 705 insertions(+), 6 deletions(-) create mode 100644 tests/VectorDrawableTest/res/color/fill_gradient_linear_clamp.xml create mode 100644 tests/VectorDrawableTest/res/color/fill_gradient_linear_item_overlap_mirror.xml create mode 100644 tests/VectorDrawableTest/res/color/fill_gradient_linear_item_repeat.xml create mode 100644 tests/VectorDrawableTest/res/color/fill_gradient_radial_clamp.xml create mode 100644 tests/VectorDrawableTest/res/color/fill_gradient_radial_item_repeat.xml create mode 100644 tests/VectorDrawableTest/res/color/fill_gradient_radial_item_short_mirror.xml create mode 100644 tests/VectorDrawableTest/res/color/fill_gradient_sweep_clamp.xml create mode 100644 tests/VectorDrawableTest/res/color/fill_gradient_sweep_item_long_mirror.xml create mode 100644 tests/VectorDrawableTest/res/color/fill_gradient_sweep_item_repeat.xml create mode 100644 tests/VectorDrawableTest/res/color/stroke_gradient_clamp.xml create mode 100644 tests/VectorDrawableTest/res/color/stroke_gradient_item_alpha_mirror.xml create mode 100644 tests/VectorDrawableTest/res/color/stroke_gradient_item_repeat.xml create mode 100644 tests/VectorDrawableTest/res/drawable/vector_icon_gradient_1_clamp.xml create mode 100644 tests/VectorDrawableTest/res/drawable/vector_icon_gradient_2_repeat.xml create mode 100644 tests/VectorDrawableTest/res/drawable/vector_icon_gradient_3_mirror.xml diff --git a/core/java/android/content/res/GradientColor.java b/core/java/android/content/res/GradientColor.java index 98ef2eaa5e6d..cc46cbd43258 100644 --- a/core/java/android/content/res/GradientColor.java +++ b/core/java/android/content/res/GradientColor.java @@ -17,6 +17,7 @@ package android.content.res; import android.annotation.ColorInt; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.res.Resources.Theme; @@ -37,13 +38,48 @@ import android.util.Log; import android.util.Xml; import java.io.IOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; - +/** + * Lets you define a gradient color, which is used inside + * {@link android.graphics.drawable.VectorDrawable}. + * + * {@link android.content.res.GradientColor}s are created from XML resource files defined in the + * "color" subdirectory directory of an application's resource directory. The XML file contains + * a single "gradient" element with a number of attributes and elements inside. For example: + *
+ * <gradient xmlns:android="http://schemas.android.com/apk/res/android">
+ *   <android:startColor="?android:attr/colorPrimary"/>
+ *   <android:endColor="?android:attr/colorControlActivated"/>
+ *   <.../>
+ *   <android:type="linear"/>
+ * </gradient>
+ * 
+ * + * This can describe either a {@link android.graphics.LinearGradient}, + * {@link android.graphics.RadialGradient}, or {@link android.graphics.SweepGradient}. + * + * Note that different attributes are relevant for different types of gradient. + * For example, android:gradientRadius is only applied to RadialGradient. + * androd:centerX and android:centerY are only applied to SweepGradient or RadialGradient. + * android:startX, android:startY, android:endX and android:endY are only applied to LinearGradient. + * + * Also note if any color "item" element is defined, then startColor, centerColor and endColor will + * be ignored. + */ public class GradientColor extends ComplexColor { private static final String TAG = "GradientColor"; private static final boolean DBG_GRADIENT = false; + @IntDef({TILE_MODE_CLAMP, TILE_MODE_REPEAT, TILE_MODE_MIRROR}) + @Retention(RetentionPolicy.SOURCE) + private @interface GradientTileMode {} + private static final int TILE_MODE_CLAMP = 0; + private static final int TILE_MODE_REPEAT = 1; + private static final int TILE_MODE_MIRROR = 2; + /** Lazily-created factory for this GradientColor. */ private GradientColorFactory mFactory; @@ -54,7 +90,8 @@ public class GradientColor extends ComplexColor { // all the XML information. private Shader mShader = null; - // Below are the attributes at the root element + // Below are the attributes at the root element . + // NOTE: they need to be copied in the copy constructor! private int mGradientType = GradientDrawable.LINEAR_GRADIENT; private float mCenterX = 0f; @@ -70,6 +107,8 @@ public class GradientColor extends ComplexColor { private int mEndColor = 0; private boolean mHasCenterColor = false; + private int mTileMode = 0; // Clamp mode. + private float mGradientRadius = 0f; // Below are the attributes for the element. @@ -100,6 +139,7 @@ public class GradientColor extends ComplexColor { mEndColor = copy.mEndColor; mHasCenterColor = copy.mHasCenterColor; mGradientRadius = copy.mGradientRadius; + mTileMode = copy.mTileMode; if (copy.mItemColors != null) { mItemColors = copy.mItemColors.clone(); @@ -117,6 +157,20 @@ public class GradientColor extends ComplexColor { } } + // Set the default to clamp mode. + private static Shader.TileMode parseTileMode(@GradientTileMode int tileMode) { + switch (tileMode) { + case TILE_MODE_CLAMP: + return Shader.TileMode.CLAMP; + case TILE_MODE_REPEAT: + return Shader.TileMode.REPEAT; + case TILE_MODE_MIRROR: + return Shader.TileMode.MIRROR; + default: + return Shader.TileMode.CLAMP; + } + } + /** * Update the root level's attributes, either for inflate or applyTheme. */ @@ -150,6 +204,9 @@ public class GradientColor extends ComplexColor { mEndColor = a.getColor( R.styleable.GradientColor_endColor, mEndColor); + mTileMode = a.getInt( + R.styleable.GradientColor_tileMode, mTileMode); + if (DBG_GRADIENT) { Log.v(TAG, "hasCenterColor is " + mHasCenterColor); if (mHasCenterColor) { @@ -157,6 +214,7 @@ public class GradientColor extends ComplexColor { } Log.v(TAG, "startColor: " + mStartColor); Log.v(TAG, "endColor: " + mEndColor); + Log.v(TAG, "tileMode: " + mTileMode); } mGradientRadius = a.getFloat(R.styleable.GradientColor_gradientRadius, @@ -406,11 +464,11 @@ public class GradientColor extends ComplexColor { if (mGradientType == GradientDrawable.LINEAR_GRADIENT) { mShader = new LinearGradient(mStartX, mStartY, mEndX, mEndY, tempColors, tempOffsets, - Shader.TileMode.CLAMP); + parseTileMode(mTileMode)); } else { if (mGradientType == GradientDrawable.RADIAL_GRADIENT) { mShader = new RadialGradient(mCenterX, mCenterY, mGradientRadius, tempColors, - tempOffsets, Shader.TileMode.CLAMP); + tempOffsets, parseTileMode(mTileMode)); } else { mShader = new SweepGradient(mCenterX, mCenterY, tempColors, tempOffsets); } diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 90a573ba8fbd..9ccd7f0a77dd 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -8170,6 +8170,8 @@ i Defined in same coordinates as the path itself --> + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/color/fill_gradient_linear_item_overlap_mirror.xml b/tests/VectorDrawableTest/res/color/fill_gradient_linear_item_overlap_mirror.xml new file mode 100644 index 000000000000..d342bca32208 --- /dev/null +++ b/tests/VectorDrawableTest/res/color/fill_gradient_linear_item_overlap_mirror.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/color/fill_gradient_linear_item_repeat.xml b/tests/VectorDrawableTest/res/color/fill_gradient_linear_item_repeat.xml new file mode 100644 index 000000000000..afb45aa2eebe --- /dev/null +++ b/tests/VectorDrawableTest/res/color/fill_gradient_linear_item_repeat.xml @@ -0,0 +1,33 @@ + + + + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/color/fill_gradient_radial_clamp.xml b/tests/VectorDrawableTest/res/color/fill_gradient_radial_clamp.xml new file mode 100644 index 000000000000..64b32f6fba3f --- /dev/null +++ b/tests/VectorDrawableTest/res/color/fill_gradient_radial_clamp.xml @@ -0,0 +1,28 @@ + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/color/fill_gradient_radial_item.xml b/tests/VectorDrawableTest/res/color/fill_gradient_radial_item.xml index 51b0e173f746..c6cea7c5c698 100644 --- a/tests/VectorDrawableTest/res/color/fill_gradient_radial_item.xml +++ b/tests/VectorDrawableTest/res/color/fill_gradient_radial_item.xml @@ -1,5 +1,5 @@ - + + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/color/fill_gradient_radial_item_short.xml b/tests/VectorDrawableTest/res/color/fill_gradient_radial_item_short.xml index 8caa1b4348a2..fefbe9f05eff 100644 --- a/tests/VectorDrawableTest/res/color/fill_gradient_radial_item_short.xml +++ b/tests/VectorDrawableTest/res/color/fill_gradient_radial_item_short.xml @@ -1,5 +1,5 @@ - + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/color/fill_gradient_sweep_clamp.xml b/tests/VectorDrawableTest/res/color/fill_gradient_sweep_clamp.xml new file mode 100644 index 000000000000..80f39f3ee980 --- /dev/null +++ b/tests/VectorDrawableTest/res/color/fill_gradient_sweep_clamp.xml @@ -0,0 +1,28 @@ + + + + diff --git a/tests/VectorDrawableTest/res/color/fill_gradient_sweep_item_long_mirror.xml b/tests/VectorDrawableTest/res/color/fill_gradient_sweep_item_long_mirror.xml new file mode 100644 index 000000000000..0890bd6fc733 --- /dev/null +++ b/tests/VectorDrawableTest/res/color/fill_gradient_sweep_item_long_mirror.xml @@ -0,0 +1,31 @@ + + + + + + + + + + diff --git a/tests/VectorDrawableTest/res/color/fill_gradient_sweep_item_repeat.xml b/tests/VectorDrawableTest/res/color/fill_gradient_sweep_item_repeat.xml new file mode 100644 index 000000000000..2ec50148b44d --- /dev/null +++ b/tests/VectorDrawableTest/res/color/fill_gradient_sweep_item_repeat.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/tests/VectorDrawableTest/res/color/stroke_gradient_clamp.xml b/tests/VectorDrawableTest/res/color/stroke_gradient_clamp.xml new file mode 100644 index 000000000000..3d746e720cf8 --- /dev/null +++ b/tests/VectorDrawableTest/res/color/stroke_gradient_clamp.xml @@ -0,0 +1,30 @@ + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/color/stroke_gradient_item_alpha_mirror.xml b/tests/VectorDrawableTest/res/color/stroke_gradient_item_alpha_mirror.xml new file mode 100644 index 000000000000..352a2fd463a8 --- /dev/null +++ b/tests/VectorDrawableTest/res/color/stroke_gradient_item_alpha_mirror.xml @@ -0,0 +1,29 @@ + + + + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/color/stroke_gradient_item_repeat.xml b/tests/VectorDrawableTest/res/color/stroke_gradient_item_repeat.xml new file mode 100644 index 000000000000..42281d15dc0b --- /dev/null +++ b/tests/VectorDrawableTest/res/color/stroke_gradient_item_repeat.xml @@ -0,0 +1,33 @@ + + + + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/drawable/vector_icon_gradient_1_clamp.xml b/tests/VectorDrawableTest/res/drawable/vector_icon_gradient_1_clamp.xml new file mode 100644 index 000000000000..2fa440a84cff --- /dev/null +++ b/tests/VectorDrawableTest/res/drawable/vector_icon_gradient_1_clamp.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/drawable/vector_icon_gradient_2_repeat.xml b/tests/VectorDrawableTest/res/drawable/vector_icon_gradient_2_repeat.xml new file mode 100644 index 000000000000..5a43f804a6e0 --- /dev/null +++ b/tests/VectorDrawableTest/res/drawable/vector_icon_gradient_2_repeat.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/res/drawable/vector_icon_gradient_3_mirror.xml b/tests/VectorDrawableTest/res/drawable/vector_icon_gradient_3_mirror.xml new file mode 100644 index 000000000000..e8de7c2b1f5d --- /dev/null +++ b/tests/VectorDrawableTest/res/drawable/vector_icon_gradient_3_mirror.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawablePerformance.java b/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawablePerformance.java index 717214740698..495d62010fb8 100644 --- a/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawablePerformance.java +++ b/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawablePerformance.java @@ -38,6 +38,9 @@ public class VectorDrawablePerformance extends Activity { R.drawable.vector_icon_gradient_1, R.drawable.vector_icon_gradient_2, R.drawable.vector_icon_gradient_3, + R.drawable.vector_icon_gradient_1_clamp, + R.drawable.vector_icon_gradient_2_repeat, + R.drawable.vector_icon_gradient_3_mirror, R.drawable.vector_icon_state_list_simple, R.drawable.vector_icon_state_list_theme, R.drawable.vector_drawable01, -- 2.11.0