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." 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Any Shape can be drawn to a Canvas with its own draw() method, 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but more graphical control is available if you instead pass 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it to a {@link android.graphics.drawable.ShapeDrawable}. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class Shape implements Cloneable { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mWidth; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mHeight; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the width of the Shape. 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float getWidth() { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWidth; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the height of the Shape. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float getHeight() { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeight; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw this shape into the provided Canvas, with the provided Paint. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Before calling this, you must call {@link #resize(float,float)}. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param canvas the Canvas within which this shape should be drawn 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint the Paint object that defines this shape's characteristics 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract void draw(Canvas canvas, Paint paint); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Resizes the dimensions of this shape. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Must be called before {@link #draw(Canvas,Paint)}. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width of the shape (in pixels) 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the height of the shape (in pixels) 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void resize(float width, float height) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (width < 0) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project width = 0; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (height < 0) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height =0; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWidth != width || mHeight != height) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = width; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = height; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onResize(width, height); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether the Shape is opaque. 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default impl returns true. Override if your subclass can be opaque. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if any part of the drawable is <em>not</em> opaque. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasAlpha() { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Callback method called when {@link #resize(float,float)} is executed. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the new width of the Shape 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the new height of the Shape 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onResize(float width, float height) {} 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 967979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craik /** 976beeb75723cec42603b47664bce794a2b97d7bacChet Haase * Compute the Outline of the shape and return it in the supplied Outline 986beeb75723cec42603b47664bce794a2b97d7bacChet Haase * parameter. The default implementation does nothing and {@code outline} is not changed. 997979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craik * 1006beeb75723cec42603b47664bce794a2b97d7bacChet Haase * @param outline The Outline to be populated with the result. Should not be null. 1017979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craik */ 1026beeb75723cec42603b47664bce794a2b97d7bacChet Haase public void getOutline(@NonNull Outline outline) {} 1037979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craik 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Shape clone() throws CloneNotSupportedException { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (Shape) super.clone(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1087979388d4f7d5d9dbfcf7e1cc4709f8088c034aeChris Craik 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 110