/* * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.drawee.generic; import java.util.Arrays; import android.graphics.Color; import com.facebook.common.internal.Preconditions; /** * Class that encapsulates rounding parameters. */ public class RoundingParams { public enum RoundingMethod { /** * Draws rounded corners on top of the underlying drawable by overlaying a solid color which * is specified by {@code setOverlayColor}. This option should only be used when the * background beneath the underlying drawable is static and of the same solid color. */ OVERLAY_COLOR, /** * Uses BitmapShader to draw bitmap with rounded corners. Works only with BitmapDrawables and * ColorDrawables. * IMPORTANT: Only the actual image and the placeholder image will get rounded. Other images * (such as retry, failure, progress bar, backgrounds, overlays, etc.) won't get rounded. */ BITMAP_ONLY } private RoundingMethod mRoundingMethod = RoundingMethod.BITMAP_ONLY; private boolean mRoundAsCircle = false; private float[] mCornersRadii = null; private int mOverlayColor = 0; private float mBorderWidth = 0; private int mBorderColor = Color.TRANSPARENT; /** * Sets whether to round as circle. * * @param roundAsCircle whether or not to round as circle * @return modified instance */ public RoundingParams setRoundAsCircle(boolean roundAsCircle) { mRoundAsCircle = roundAsCircle; return this; } /** Gets whether to round as circle */ public boolean getRoundAsCircle() { return mRoundAsCircle; } /** * Sets the rounded corners radius. * * @param radius corner radius in pixels * @return modified instance */ public RoundingParams setCornersRadius(float radius) { Arrays.fill(getOrCreateRoundedCornersRadii(), radius); return this; } /** * Sets the rounded corners radii. * * @param topLeft top-left corner radius in pixels * @param topRight top-right corner radius in pixels * @param bottomRight bottom-right corner radius in pixels * @param bottomLeft bottom-left corner radius in pixels * @return modified instance */ public RoundingParams setCornersRadii( float topLeft, float topRight, float bottomRight, float bottomLeft) { float[] radii = getOrCreateRoundedCornersRadii(); radii[0] = radii[1] = topLeft; radii[2] = radii[3] = topRight; radii[4] = radii[5] = bottomRight; radii[6] = radii[7] = bottomLeft; return this; } /** * Sets the rounded corners radii. * * @param radii float array of 8 radii in pixels. Each corner receives two radius values [X, Y]. * The corners are ordered top-left, top-right, bottom-right, bottom-left. * @return modified instance */ public RoundingParams setCornersRadii(float[] radii) { Preconditions.checkNotNull(radii); Preconditions.checkArgument(radii.length == 8, "radii should have exactly 8 values"); System.arraycopy(radii, 0, getOrCreateRoundedCornersRadii(), 0, 8); return this; } /** * Gets the rounded corners radii. * * <p> For performance reasons the internal array is returned directly. Do not modify it directly, * but use one of the exposed corner radii setters instead. */ public float[] getCornersRadii() { return mCornersRadii; } /** * Sets the rounding method. * * @param roundingMethod method of rounding * @return modified instance */ public RoundingParams setRoundingMethod(RoundingMethod roundingMethod) { mRoundingMethod = roundingMethod; return this; } /** Gets the rounding method. */ public RoundingMethod getRoundingMethod() { return mRoundingMethod; } /** * Sets the overlay color and changes the method to {@code RoundingMethod.COLOR_OVERLAY}. * * @param overlayColor overlay color */ public RoundingParams setOverlayColor(int overlayColor) { mOverlayColor = overlayColor; mRoundingMethod = RoundingMethod.OVERLAY_COLOR; return this; } /** Gets the overlay color. */ public int getOverlayColor() { return mOverlayColor; } private float[] getOrCreateRoundedCornersRadii() { if (mCornersRadii == null) { mCornersRadii = new float[8]; } return mCornersRadii; } /** Factory method that creates new RoundingParams with RoundAsCircle specified. */ public static RoundingParams asCircle() { return (new RoundingParams()).setRoundAsCircle(true); } /** Factory method that creates new RoundingParams with the specified corners radius. */ public static RoundingParams fromCornersRadius(float radius) { return (new RoundingParams()).setCornersRadius(radius); } /** Factory method that creates new RoundingParams with the specified corners radii. */ public static RoundingParams fromCornersRadii( float topLeft, float topRight, float bottomRight, float bottomLeft) { return (new RoundingParams()) .setCornersRadii(topLeft, topRight, bottomRight, bottomLeft); } /** Factory method that creates new RoundingParams with the specified corners radii. */ public static RoundingParams fromCornersRadii(float[] radii) { return (new RoundingParams()).setCornersRadii(radii); } /** * Sets the border around the rounded drawable * @param color of the border * @param width of the width */ public RoundingParams setBorder(int color, float width) { Preconditions.checkArgument(width >= 0, "the border width cannot be < 0"); mBorderWidth = width; mBorderColor = color; return this; } /** Gets the border width */ public float getBorderWidth() { return mBorderWidth; } /** Gets the border color */ public int getBorderColor() { return mBorderColor; } }