blob: 54ef3f76f248fce939ab46890db7d19902834754 [file] [log] [blame]
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.graphics.drawable.shapes;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
/**
* Creates a rounded-corner rectangle. Optionally, an inset (rounded) rectangle
* can be included (to make a sort of "O" shape).
* The rounded rectangle can be drawn to a Canvas with its own draw() method,
* but more graphical control is available if you instead pass
* the RoundRectShape to a {@link android.graphics.drawable.ShapeDrawable}.
*/
public class RoundRectShape extends RectShape {
private float[] mOuterRadii;
private RectF mInset;
private float[] mInnerRadii;
private RectF mInnerRect;
private Path mPath; // this is what we actually draw
/**
* RoundRectShape constructor.
* Specifies an outer (round)rect and an optional inner (round)rect.
*
* @param outerRadii An array of 8 radius values, for the outer roundrect.
* The first two floats are for the
* top-left corner (remaining pairs correspond clockwise).
* For no rounded corners on the outer rectangle,
* pass null.
* @param inset A RectF that specifies the distance from the inner
* rect to each side of the outer rect.
* For no inner, pass null.
* @param innerRadii An array of 8 radius values, for the inner roundrect.
* The first two floats are for the
* top-left corner (remaining pairs correspond clockwise).
* For no rounded corners on the inner rectangle,
* pass null.
* If inset parameter is null, this parameter is ignored.
*/
public RoundRectShape(float[] outerRadii, RectF inset,
float[] innerRadii) {
if (outerRadii.length < 8) {
throw new ArrayIndexOutOfBoundsException(
"outer radii must have >= 8 values");
}
if (innerRadii != null && innerRadii.length < 8) {
throw new ArrayIndexOutOfBoundsException(
"inner radii must have >= 8 values");
}
mOuterRadii = outerRadii;
mInset = inset;
mInnerRadii = innerRadii;
if (inset != null) {
mInnerRect = new RectF();
}
mPath = new Path();
}
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawPath(mPath, paint);
}
@Override
protected void onResize(float w, float h) {
super.onResize(w, h);
RectF r = rect();
mPath.reset();
if (mOuterRadii != null) {
mPath.addRoundRect(r, mOuterRadii, Path.Direction.CW);
} else {
mPath.addRect(r, Path.Direction.CW);
}
if (mInnerRect != null) {
mInnerRect.set(r.left + mInset.left, r.top + mInset.top,
r.right - mInset.right, r.bottom - mInset.bottom);
if (mInnerRect.width() < w && mInnerRect.height() < h) {
if (mInnerRadii != null) {
mPath.addRoundRect(mInnerRect, mInnerRadii,
Path.Direction.CCW);
} else {
mPath.addRect(mInnerRect, Path.Direction.CCW);
}
}
}
}
}