19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics.drawable.shapes;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
196beeb75723cec42603b47664bce794a2b97d7bacChet Haaseimport android.annotation.NonNull;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
217979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craikimport android.graphics.Outline;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Paint;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defines a generic graphical "shape."
26446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette * <p>
27446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette * Any Shape can be drawn to a Canvas with its own draw() method, but more
28446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette * graphical control is available if you instead pass it to a
29446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette * {@link android.graphics.drawable.ShapeDrawable}.
30446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette * <p>
31446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette * Custom Shape classes must implement {@link #clone()} and return an instance
32446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette * of the custom Shape class.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class Shape implements Cloneable {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mWidth;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mHeight;
37446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the width of the Shape.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getWidth() {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWidth;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the height of the Shape.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getHeight() {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeight;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
53446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * Draws this shape into the provided Canvas, with the provided Paint.
54446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * <p>
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Before calling this, you must call {@link #resize(float,float)}.
56446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     *
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas the Canvas within which this shape should be drawn
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param paint  the Paint object that defines this shape's characteristics
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract void draw(Canvas canvas, Paint paint);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Resizes the dimensions of this shape.
64446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * <p>
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Must be called before {@link #draw(Canvas,Paint)}.
66446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     *
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param width the width of the shape (in pixels)
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param height the height of the shape (in pixels)
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void resize(float width, float height) {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (width < 0) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            width = 0;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (height < 0) {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            height =0;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWidth != width || mHeight != height) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWidth = width;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHeight = height;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onResize(width, height);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether the Shape is opaque.
86446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * <p>
87446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * Default impl returns {@code true}. Override if your subclass can be
88446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * opaque.
89446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     *
90446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * @return true if any part of the drawable is <em>not</em> opaque.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasAlpha() {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
95446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Callback method called when {@link #resize(float,float)} is executed.
98446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     *
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param width the new width of the Shape
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param height the new height of the Shape
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onResize(float width, float height) {}
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1047979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craik    /**
105446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * Computes the Outline of the shape and return it in the supplied Outline
106446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * parameter. The default implementation does nothing and {@code outline}
107446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * is not changed.
1087979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craik     *
109446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     * @param outline the Outline to be populated with the result. Must be
110446d988b44b6e492e4cfc36be00a1e1aeaaf8c20Alan Viverette     *                non-{@code null}.
1117979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craik     */
1126beeb75723cec42603b47664bce794a2b97d7bacChet Haase    public void getOutline(@NonNull Outline outline) {}
1137979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craik
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Shape clone() throws CloneNotSupportedException {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (Shape) super.clone();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
119