OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.content.browser; | 5 package org.chromium.content.browser; |
6 | 6 |
7 import android.view.View; | 7 import android.view.View; |
8 import android.view.ViewTreeObserver; | 8 import android.view.ViewTreeObserver; |
9 | 9 |
10 import java.util.ArrayList; | 10 import org.chromium.base.ObserverList; |
11 | 11 |
12 /** | 12 /** |
13 * Used to register listeners that can be notified of changes to the position of a view. | 13 * Used to register listeners that can be notified of changes to the position of a view. |
14 */ | 14 */ |
15 public class ViewPositionObserver implements PositionObserver { | 15 public class ViewPositionObserver implements PositionObserver { |
16 private View mView; | 16 private View mView; |
17 // Absolute position of the container view relative to its parent window. | 17 // Absolute position of the container view relative to its parent window. |
18 private final int[] mPosition = new int[2]; | 18 private final int[] mPosition = new int[2]; |
19 | 19 |
20 private final ArrayList<Listener> mListeners; | 20 private final ObserverList<Listener> mListeners; |
Yaron
2014/07/22 19:20:25
Note that there is slightly more overhead to using
wajahat
2014/07/23 04:24:16
ok reverting this change
| |
21 private ViewTreeObserver.OnPreDrawListener mPreDrawListener; | 21 private ViewTreeObserver.OnPreDrawListener mPreDrawListener; |
22 | 22 |
23 /** | 23 /** |
24 * @param view The view to observe. | 24 * @param view The view to observe. |
25 */ | 25 */ |
26 public ViewPositionObserver(View view) { | 26 public ViewPositionObserver(View view) { |
27 mView = view; | 27 mView = view; |
28 mListeners = new ArrayList<Listener>(); | 28 mListeners = new ObserverList<Listener>(); |
29 updatePosition(); | 29 updatePosition(); |
30 mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { | 30 mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { |
31 @Override | 31 @Override |
32 public boolean onPreDraw() { | 32 public boolean onPreDraw() { |
33 updatePosition(); | 33 updatePosition(); |
34 return true; | 34 return true; |
35 } | 35 } |
36 }; | 36 }; |
37 } | 37 } |
38 | 38 |
(...skipping 15 matching lines...) Expand all Loading... | |
54 // The stored position may be out-of-date. Get the real current position . | 54 // The stored position may be out-of-date. Get the real current position . |
55 updatePosition(); | 55 updatePosition(); |
56 return mPosition[1]; | 56 return mPosition[1]; |
57 } | 57 } |
58 | 58 |
59 /** | 59 /** |
60 * Register a listener to be called when the position of the underlying view changes. | 60 * Register a listener to be called when the position of the underlying view changes. |
61 */ | 61 */ |
62 @Override | 62 @Override |
63 public void addListener(Listener listener) { | 63 public void addListener(Listener listener) { |
64 if (mListeners.contains(listener)) return; | |
Yaron
2014/07/22 19:20:25
This is different than what ObserverList is deisgn
wajahat
2014/07/23 04:24:16
ok, reverting this change
| |
65 | |
66 if (mListeners.isEmpty()) { | 64 if (mListeners.isEmpty()) { |
67 mView.getViewTreeObserver().addOnPreDrawListener(mPreDrawListener); | 65 mView.getViewTreeObserver().addOnPreDrawListener(mPreDrawListener); |
68 updatePosition(); | 66 updatePosition(); |
69 } | 67 } |
70 | 68 |
71 mListeners.add(listener); | 69 mListeners.addObserver(listener); |
72 } | 70 } |
73 | 71 |
74 /** | 72 /** |
75 * Remove a previously installed listener. | 73 * Remove a previously installed listener. |
76 */ | 74 */ |
77 @Override | 75 @Override |
78 public void removeListener(Listener listener) { | 76 public void removeListener(Listener listener) { |
79 if (!mListeners.contains(listener)) return; | 77 mListeners.removeObserver(listener); |
80 | |
81 mListeners.remove(listener); | |
82 | 78 |
83 if (mListeners.isEmpty()) { | 79 if (mListeners.isEmpty()) { |
84 mView.getViewTreeObserver().removeOnPreDrawListener(mPreDrawListener ); | 80 mView.getViewTreeObserver().removeOnPreDrawListener(mPreDrawListener ); |
85 } | 81 } |
86 } | 82 } |
87 | 83 |
88 private void notifyListeners() { | 84 private void notifyListeners() { |
89 for (int i = 0; i < mListeners.size(); i++) { | 85 for (PositionObserver.Listener listener : mListeners) { |
90 mListeners.get(i).onPositionChanged(mPosition[0], mPosition[1]); | 86 listener.onPositionChanged(mPosition[0], mPosition[1]); |
91 } | 87 } |
92 } | 88 } |
93 | 89 |
94 private void updatePosition() { | 90 private void updatePosition() { |
95 int previousPositionX = mPosition[0]; | 91 int previousPositionX = mPosition[0]; |
96 int previousPositionY = mPosition[1]; | 92 int previousPositionY = mPosition[1]; |
97 mView.getLocationInWindow(mPosition); | 93 mView.getLocationInWindow(mPosition); |
98 if (mPosition[0] != previousPositionX || mPosition[1] != previousPositio nY) { | 94 if (mPosition[0] != previousPositionX || mPosition[1] != previousPositio nY) { |
99 notifyListeners(); | 95 notifyListeners(); |
100 } | 96 } |
101 } | 97 } |
98 | |
99 /** | |
100 * Clears installed listener(s). | |
101 */ | |
102 public void clearListener() { | |
103 mListeners.clear(); | |
104 } | |
102 } | 105 } |
103 | 106 |
OLD | NEW |