• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.graphics;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 
22 public class RadialGradient extends Shader {
23 
24     private static final int TYPE_COLORS_AND_POSITIONS = 1;
25     private static final int TYPE_COLOR_CENTER_AND_COLOR_EDGE = 2;
26 
27     /**
28      * Type of the RadialGradient: can be either TYPE_COLORS_AND_POSITIONS or
29      * TYPE_COLOR_CENTER_AND_COLOR_EDGE.
30      */
31     private int mType;
32 
33     private float mX;
34     private float mY;
35     private float mRadius;
36     private int[] mColors;
37     private float[] mPositions;
38     private int mCenterColor;
39     private int mEdgeColor;
40 
41     private TileMode mTileMode;
42 
43     /** Create a shader that draws a radial gradient given the center and radius.
44         @param centerX  The x-coordinate of the center of the radius
45         @param centerY  The y-coordinate of the center of the radius
46         @param radius   Must be positive. The radius of the circle for this gradient.
47         @param colors   The colors to be distributed between the center and edge of the circle
48         @param stops    May be <code>null</code>. Valid values are between <code>0.0f</code> and
49                         <code>1.0f</code>. The relative position of each corresponding color in
50                         the colors array. If <code>null</code>, colors are distributed evenly
51                         between the center and edge of the circle.
52         @param tileMode The Shader tiling mode
53     */
RadialGradient(float centerX, float centerY, float radius, @NonNull int colors[], @Nullable float stops[], @NonNull TileMode tileMode)54     public RadialGradient(float centerX, float centerY, float radius,
55                @NonNull int colors[], @Nullable float stops[], @NonNull TileMode tileMode) {
56         if (radius <= 0) {
57             throw new IllegalArgumentException("radius must be > 0");
58         }
59         if (colors.length < 2) {
60             throw new IllegalArgumentException("needs >= 2 number of colors");
61         }
62         if (stops != null && colors.length != stops.length) {
63             throw new IllegalArgumentException("color and position arrays must be of equal length");
64         }
65         mType = TYPE_COLORS_AND_POSITIONS;
66         mX = centerX;
67         mY = centerY;
68         mRadius = radius;
69         mColors = colors;
70         mPositions = stops;
71         mTileMode = tileMode;
72         init(nativeCreate1(centerX, centerY, radius, colors, stops, tileMode.nativeInt));
73     }
74 
75     /** Create a shader that draws a radial gradient given the center and radius.
76         @param centerX     The x-coordinate of the center of the radius
77         @param centerY     The y-coordinate of the center of the radius
78         @param radius      Must be positive. The radius of the circle for this gradient
79         @param centerColor The color at the center of the circle.
80         @param edgeColor   The color at the edge of the circle.
81         @param tileMode    The Shader tiling mode
82     */
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, @NonNull TileMode tileMode)83     public RadialGradient(float centerX, float centerY, float radius,
84             int centerColor, int edgeColor, @NonNull TileMode tileMode) {
85         if (radius <= 0) {
86             throw new IllegalArgumentException("radius must be > 0");
87         }
88         mType = TYPE_COLOR_CENTER_AND_COLOR_EDGE;
89         mX = centerX;
90         mY = centerY;
91         mRadius = radius;
92         mCenterColor = centerColor;
93         mEdgeColor = edgeColor;
94         mTileMode = tileMode;
95         init(nativeCreate2(centerX, centerY, radius, centerColor, edgeColor, tileMode.nativeInt));
96     }
97 
98     /**
99      * @hide
100      */
101     @Override
copy()102     protected Shader copy() {
103         final RadialGradient copy;
104         switch (mType) {
105             case TYPE_COLORS_AND_POSITIONS:
106                 copy = new RadialGradient(mX, mY, mRadius, mColors.clone(),
107                         mPositions != null ? mPositions.clone() : null, mTileMode);
108                 break;
109             case TYPE_COLOR_CENTER_AND_COLOR_EDGE:
110                 copy = new RadialGradient(mX, mY, mRadius, mCenterColor, mEdgeColor, mTileMode);
111                 break;
112             default:
113                 throw new IllegalArgumentException("RadialGradient should be created with either " +
114                         "colors and positions or center color and edge color");
115         }
116         copyLocalMatrix(copy);
117         return copy;
118     }
119 
nativeCreate1(float x, float y, float radius, int colors[], float positions[], int tileMode)120     private static native long nativeCreate1(float x, float y, float radius,
121             int colors[], float positions[], int tileMode);
nativeCreate2(float x, float y, float radius, int color0, int color1, int tileMode)122     private static native long nativeCreate2(float x, float y, float radius,
123             int color0, int color1, int tileMode);
124 }
125 
126