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