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    }
94a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes}