1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.support.transition; 18 19import android.view.View; 20 21/** 22 * Base class for <code>TransitionPropagation</code>s that care about 23 * View Visibility and the center position of the View. 24 */ 25public abstract class VisibilityPropagation extends TransitionPropagation { 26 27 /** 28 * The property key used for {@link android.view.View#getVisibility()}. 29 */ 30 private static final String PROPNAME_VISIBILITY = "android:visibilityPropagation:visibility"; 31 32 /** 33 * The property key used for the center of the View in screen coordinates. This is an 34 * int[2] with the index 0 taking the x coordinate and index 1 taking the y coordinate. 35 */ 36 private static final String PROPNAME_VIEW_CENTER = "android:visibilityPropagation:center"; 37 38 private static final String[] VISIBILITY_PROPAGATION_VALUES = { 39 PROPNAME_VISIBILITY, 40 PROPNAME_VIEW_CENTER, 41 }; 42 43 @Override 44 public void captureValues(TransitionValues values) { 45 View view = values.view; 46 Integer visibility = (Integer) values.values.get(Visibility.PROPNAME_VISIBILITY); 47 if (visibility == null) { 48 visibility = view.getVisibility(); 49 } 50 values.values.put(PROPNAME_VISIBILITY, visibility); 51 int[] loc = new int[2]; 52 view.getLocationOnScreen(loc); 53 loc[0] += Math.round(view.getTranslationX()); 54 loc[0] += view.getWidth() / 2; 55 loc[1] += Math.round(view.getTranslationY()); 56 loc[1] += view.getHeight() / 2; 57 values.values.put(PROPNAME_VIEW_CENTER, loc); 58 } 59 60 @Override 61 public String[] getPropagationProperties() { 62 return VISIBILITY_PROPAGATION_VALUES; 63 } 64 65 /** 66 * Returns {@link android.view.View#getVisibility()} for the View at the time the values 67 * were captured. 68 * @param values The TransitionValues captured at the start or end of the Transition. 69 * @return {@link android.view.View#getVisibility()} for the View at the time the values 70 * were captured. 71 */ 72 public int getViewVisibility(TransitionValues values) { 73 if (values == null) { 74 return View.GONE; 75 } 76 Integer visibility = (Integer) values.values.get(PROPNAME_VISIBILITY); 77 if (visibility == null) { 78 return View.GONE; 79 } 80 return visibility; 81 } 82 83 /** 84 * Returns the View's center x coordinate, relative to the screen, at the time the values 85 * were captured. 86 * @param values The TransitionValues captured at the start or end of the Transition. 87 * @return the View's center x coordinate, relative to the screen, at the time the values 88 * were captured. 89 */ 90 public int getViewX(TransitionValues values) { 91 return getViewCoordinate(values, 0); 92 } 93 94 /** 95 * Returns the View's center y coordinate, relative to the screen, at the time the values 96 * were captured. 97 * @param values The TransitionValues captured at the start or end of the Transition. 98 * @return the View's center y coordinate, relative to the screen, at the time the values 99 * were captured. 100 */ 101 public int getViewY(TransitionValues values) { 102 return getViewCoordinate(values, 1); 103 } 104 105 private static int getViewCoordinate(TransitionValues values, int coordinateIndex) { 106 if (values == null) { 107 return -1; 108 } 109 110 int[] coordinates = (int[]) values.values.get(PROPNAME_VIEW_CENTER); 111 if (coordinates == null) { 112 return -1; 113 } 114 115 return coordinates[coordinateIndex]; 116 } 117 118} 119