-
Notifications
You must be signed in to change notification settings - Fork 78
/
AnimateMenuAdapter.java
203 lines (178 loc) · 5.64 KB
/
AnimateMenuAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
package com.kaichunlin.transition.adapter;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.view.Menu;
import android.view.animation.LinearInterpolator;
/**
* This adapter integrates traditional animations using the same methods and logic as the rest of the framework.
* <p>
* TODO animation state callback
* <p>
* Created by Kai on 2015/6/22.
*/
public class AnimateMenuAdapter extends MenuBaseAdapter implements ValueAnimator.AnimatorUpdateListener, Animator.AnimatorListener {
private MenuOptionHandler mMenuOptionHandler = new MenuOptionHandler(this, new MenuOptionHandler.AdapterState() {
@Override
public boolean isOpened(Activity activity) {
return mOpened;
}
});
private final MenuBaseAdapter mAdapter;
private ValueAnimator mValueAnimator;
private boolean mOpened;
private int mDuration = 300;
public AnimateMenuAdapter() {
mAdapter = null;
}
/**
* Wraps an existing MenuBaseAdapter to reuse its onCreateOptionsMenu(...) logic and its transition effects
*
* @param adapter
*/
public AnimateMenuAdapter(MenuBaseAdapter adapter) {
mAdapter = adapter;
}
public void setMenuOptionHandler(MenuOptionHandler menuOptionHandler) {
mMenuOptionHandler = menuOptionHandler;
}
public void setmDuration(int duration) {
mDuration = duration;
}
/**
* Starts the animation with the default duration (300 ms)
*/
public void startAnimation() {
startAnimation(mDuration);
}
/**
* Starts the animation with the specified duration
*
* @param duration
*/
public void startAnimation(int duration) {
stopAnimation();
mValueAnimator = new ValueAnimator();
mValueAnimator.setFloatValues();
mValueAnimator.setDuration(duration);
mValueAnimator.setInterpolator(new LinearInterpolator());
if (mOpened) {
mValueAnimator.setFloatValues(1, 0);
} else {
mValueAnimator.setFloatValues(0, 1);
}
mValueAnimator.addUpdateListener(this);
mValueAnimator.addListener(this);
mValueAnimator.start();
if (mAdapter == null) {
startTransition(mOpened ? 1 : 0);
} else {
mAdapter.startTransition(mOpened ? 1 : 0);
}
mOpened = !mOpened;
}
/**
* Cancels the animation, i.e. the affected Views will retain their last states
*/
public void cancelAnimation() {
if (mValueAnimator != null) {
mValueAnimator.cancel();
mValueAnimator = null;
}
}
/**
* Ends the animation, i.e. the affected Views will jump to their final states
*/
public void endAnimation() {
if (mValueAnimator != null) {
mValueAnimator.end();
mValueAnimator = null;
}
}
/**
* Stops the animation, i.e. the affected Views will reverse to their original states
*/
public void stopAnimation() {
if (mValueAnimator != null) {
mValueAnimator.cancel();
stopTransition();
mValueAnimator = null;
}
}
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (mAdapter == null) {
updateProgress((Float) animation.getAnimatedValue());
} else {
mAdapter.updateProgress((Float) animation.getAnimatedValue());
}
}
@Override
protected MenuOptionHandler createMenuHandler() {
return mMenuOptionHandler;
}
@Override
public void setupOption(Activity activity, MenuOptionConfiguration openConfig) {
if (mAdapter == null) {
super.setupOption(activity, openConfig);
} else {
mAdapter.setupOption(activity, openConfig);
}
}
@Override
public void setupOpenOption(Activity activity, MenuOptionConfiguration openConfig) {
if (mAdapter == null) {
super.setupOpenOption(activity, openConfig);
} else {
mAdapter.setupOpenOption(activity, openConfig);
}
}
@Override
public void setupCloseOption(Activity activity, MenuOptionConfiguration closeConfig) {
if (mAdapter == null) {
super.setupCloseOption(activity, closeConfig);
} else {
mAdapter.setupCloseOption(activity, closeConfig);
}
}
@Override
public void setupOptions(Activity activity, MenuOptionConfiguration openConfig, MenuOptionConfiguration closeConfig) {
if (mAdapter == null) {
super.setupOptions(activity, openConfig, closeConfig);
} else {
mAdapter.setupOptions(activity, openConfig, closeConfig);
}
}
@Override
public void onCreateOptionsMenu(Activity activity, Menu menu) {
if (mAdapter == null) {
super.onCreateOptionsMenu(activity, menu);
} else {
mAdapter.onCreateOptionsMenu(activity, menu, mMenuOptionHandler.getAdapterState());
}
}
@Override
public void stopTransition() {
if (mAdapter == null) {
super.stopTransition();
} else {
mAdapter.stopTransition();
}
}
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
stopTransition();
mValueAnimator = null;
}
@Override
public void onAnimationCancel(Animator animation) {
stopTransition();
mValueAnimator = null;
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}