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