1a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes/* 2a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * Copyright (C) 2015 The Android Open Source Project 3a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * 4a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * you may not use this file except in compliance with the License. 6a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * You may obtain a copy of the License at 7a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * 8a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 9a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * 10a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * Unless required by applicable law or agreed to in writing, software 11a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * See the License for the specific language governing permissions and 14a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * limitations under the License. 15a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes */ 16a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 17a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banespackage android.support.design.widget; 18a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 19a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banesimport android.support.v4.view.ViewCompat; 20a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banesimport android.view.View; 21a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 22a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes/** 23a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * Utility helper for moving a {@link android.view.View} around using 24a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * {@link android.view.View#offsetLeftAndRight(int)} and 25a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * {@link android.view.View#offsetTopAndBottom(int)}. 26a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * <p> 27a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * Also the setting of absolute offsets (similar to translationX/Y), rather than additive 28a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * offsets. 29a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes */ 30a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banesclass ViewOffsetHelper { 31a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 32a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes private final View mView; 33a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 34a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes private int mLayoutTop; 35a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes private int mLayoutLeft; 36a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes private int mOffsetTop; 37a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes private int mOffsetLeft; 38a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 39a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes public ViewOffsetHelper(View view) { 40a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes mView = view; 41a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 42a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 43a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes public void onViewLayout() { 44a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes // Now grab the intended top 45a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes mLayoutTop = mView.getTop(); 46a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes mLayoutLeft = mView.getLeft(); 47a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 48a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes // And offset it as needed 49a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes updateOffsets(); 50a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 51a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 52ecd4b988781330e346244be73dca39cd04c71391Chris Banes private void updateOffsets() { 53ecd4b988781330e346244be73dca39cd04c71391Chris Banes ViewCompat.offsetTopAndBottom(mView, mOffsetTop - (mView.getTop() - mLayoutTop)); 54ecd4b988781330e346244be73dca39cd04c71391Chris Banes ViewCompat.offsetLeftAndRight(mView, mOffsetLeft - (mView.getLeft() - mLayoutLeft)); 55a59da11da29af8bc9d8e07a21d68e04d6de3df92Chris Banes } 56a59da11da29af8bc9d8e07a21d68e04d6de3df92Chris Banes 57a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes /** 58a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * Set the top and bottom offset for this {@link ViewOffsetHelper}'s view. 59a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * 60a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * @param offset the offset in px. 61a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * @return true if the offset has changed 62a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes */ 63a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes public boolean setTopAndBottomOffset(int offset) { 64a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes if (mOffsetTop != offset) { 65a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes mOffsetTop = offset; 66a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes updateOffsets(); 67a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return true; 68a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 69a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return false; 70a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 71a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 72a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes /** 73a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * Set the left and right offset for this {@link ViewOffsetHelper}'s view. 74a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * 75a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * @param offset the offset in px. 76a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes * @return true if the offset has changed 77a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes */ 78a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes public boolean setLeftAndRightOffset(int offset) { 79a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes if (mOffsetLeft != offset) { 80a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes mOffsetLeft = offset; 81a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes updateOffsets(); 82a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return true; 83a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 84a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return false; 85a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 86a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 87a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes public int getTopAndBottomOffset() { 88a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return mOffsetTop; 89a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 90a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 91a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes public int getLeftAndRightOffset() { 92a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return mOffsetLeft; 93a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 9448465fd91c91336accdced9163ea6dec13b9092cChris Banes 9548465fd91c91336accdced9163ea6dec13b9092cChris Banes public int getLayoutTop() { 9648465fd91c91336accdced9163ea6dec13b9092cChris Banes return mLayoutTop; 9748465fd91c91336accdced9163ea6dec13b9092cChris Banes } 9848465fd91c91336accdced9163ea6dec13b9092cChris Banes 9948465fd91c91336accdced9163ea6dec13b9092cChris Banes public int getLayoutLeft() { 10048465fd91c91336accdced9163ea6dec13b9092cChris Banes return mLayoutLeft; 10148465fd91c91336accdced9163ea6dec13b9092cChris Banes } 102a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes}