19a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik/* 29a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * Copyright (C) 2014 The Android Open Source Project 39a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * 49a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 59a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * you may not use this file except in compliance with the License. 69a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * You may obtain a copy of the License at 79a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * 89a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * http://www.apache.org/licenses/LICENSE-2.0 99a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * 109a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * Unless required by applicable law or agreed to in writing, software 119a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 129a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * See the License for the specific language governing permissions and 149a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * limitations under the License. 159a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik */ 169a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik 179a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craikpackage android.view; 189a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik 199a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craikimport android.graphics.Outline; 209a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craikimport android.graphics.drawable.Drawable; 219a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik 229a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik/** 239a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * Interface by which a View builds its {@link Outline}, used for shadow casting and clipping. 249a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik */ 259a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craikpublic abstract class ViewOutlineProvider { 269a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik /** 279a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * Default outline provider for Views, which queries the Outline from the View's background, 2877b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik * or generates a 0 alpha, rectangular Outline the size of the View if a background 2977b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik * isn't present. 309a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * 319a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * @see Drawable#getOutline(Outline) 329a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik */ 339a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik public static final ViewOutlineProvider BACKGROUND = new ViewOutlineProvider() { 349a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik @Override 3531ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public void getOutline(View view, Outline outline) { 369a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik Drawable background = view.getBackground(); 3731ba192dd201df2cad96a8c503f730130ab0d80fChris Craik if (background != null) { 3831ba192dd201df2cad96a8c503f730130ab0d80fChris Craik background.getOutline(outline); 3977b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik } else { 4077b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik outline.setRect(0, 0, view.getWidth(), view.getHeight()); 4177b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik outline.setAlpha(0.0f); 429a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik } 439a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik } 449a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik }; 459a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik 469a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik /** 47f56885d413b9910a414716c4652c26f888dac316Chris Craik * Maintains the outline of the View to match its rectangular bounds, 48f56885d413b9910a414716c4652c26f888dac316Chris Craik * at <code>1.0f</code> alpha. 49f56885d413b9910a414716c4652c26f888dac316Chris Craik * 50f56885d413b9910a414716c4652c26f888dac316Chris Craik * This can be used to enable Views that are opaque but lacking a background cast a shadow. 51f56885d413b9910a414716c4652c26f888dac316Chris Craik */ 52f56885d413b9910a414716c4652c26f888dac316Chris Craik public static final ViewOutlineProvider BOUNDS = new ViewOutlineProvider() { 53f56885d413b9910a414716c4652c26f888dac316Chris Craik @Override 54f56885d413b9910a414716c4652c26f888dac316Chris Craik public void getOutline(View view, Outline outline) { 55f56885d413b9910a414716c4652c26f888dac316Chris Craik outline.setRect(0, 0, view.getWidth(), view.getHeight()); 56f56885d413b9910a414716c4652c26f888dac316Chris Craik } 57f56885d413b9910a414716c4652c26f888dac316Chris Craik }; 58f56885d413b9910a414716c4652c26f888dac316Chris Craik 59f56885d413b9910a414716c4652c26f888dac316Chris Craik /** 60f56885d413b9910a414716c4652c26f888dac316Chris Craik * Maintains the outline of the View to match its rectangular padded bounds, 61f56885d413b9910a414716c4652c26f888dac316Chris Craik * at <code>1.0f</code> alpha. 62f56885d413b9910a414716c4652c26f888dac316Chris Craik * 63f56885d413b9910a414716c4652c26f888dac316Chris Craik * This can be used to enable Views that are opaque but lacking a background cast a shadow. 64f56885d413b9910a414716c4652c26f888dac316Chris Craik */ 65f56885d413b9910a414716c4652c26f888dac316Chris Craik public static final ViewOutlineProvider PADDED_BOUNDS = new ViewOutlineProvider() { 66f56885d413b9910a414716c4652c26f888dac316Chris Craik @Override 67f56885d413b9910a414716c4652c26f888dac316Chris Craik public void getOutline(View view, Outline outline) { 68f56885d413b9910a414716c4652c26f888dac316Chris Craik outline.setRect(view.getPaddingLeft(), 69f56885d413b9910a414716c4652c26f888dac316Chris Craik view.getPaddingTop(), 70f56885d413b9910a414716c4652c26f888dac316Chris Craik view.getWidth() - view.getPaddingRight(), 71f56885d413b9910a414716c4652c26f888dac316Chris Craik view.getHeight() - view.getPaddingBottom()); 72f56885d413b9910a414716c4652c26f888dac316Chris Craik } 73f56885d413b9910a414716c4652c26f888dac316Chris Craik }; 74f56885d413b9910a414716c4652c26f888dac316Chris Craik 75f56885d413b9910a414716c4652c26f888dac316Chris Craik /** 769a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * Called to get the provider to populate the Outline. 779a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * 789a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * This method will be called by a View when its owned Drawables are invalidated, when the 799a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * View's size changes, or if {@link View#invalidateOutline()} is called 809a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * explicitly. 819a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * 826efd17588bc29b1ff37143d6627f04309b1a0d7dChris Craik * The input outline is empty and has an alpha of <code>1.0f</code>. 836efd17588bc29b1ff37143d6627f04309b1a0d7dChris Craik * 849a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * @param view The view building the outline. 859a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * @param outline The empty outline to be populated. 869a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik */ 8731ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public abstract void getOutline(View view, Outline outline); 889a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik} 89