Merge change I4f01d4a4 into eclair
* changes: Fix 2209086: Clean up visual glitches in SlidingTab for lock and incall screen.
This commit is contained in:
@@ -64,6 +64,8 @@ public class SlidingTab extends ViewGroup {
|
|||||||
private static final int TRACKING_MARGIN = 50;
|
private static final int TRACKING_MARGIN = 50;
|
||||||
private static final int ANIM_DURATION = 250; // Time for most animations (in ms)
|
private static final int ANIM_DURATION = 250; // Time for most animations (in ms)
|
||||||
private static final int ANIM_TARGET_TIME = 500; // Time to show targets (in ms)
|
private static final int ANIM_TARGET_TIME = 500; // Time to show targets (in ms)
|
||||||
|
private boolean mHoldLeftOnTransition = true;
|
||||||
|
private boolean mHoldRightOnTransition = true;
|
||||||
|
|
||||||
private OnTriggerListener mOnTriggerListener;
|
private OnTriggerListener mOnTriggerListener;
|
||||||
private int mGrabbedState = OnTriggerListener.NO_HANDLE;
|
private int mGrabbedState = OnTriggerListener.NO_HANDLE;
|
||||||
@@ -85,6 +87,23 @@ public class SlidingTab extends ViewGroup {
|
|||||||
private boolean mAnimating;
|
private boolean mAnimating;
|
||||||
private Rect mTmpRect;
|
private Rect mTmpRect;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listener used to reset the view when the current animation completes.
|
||||||
|
*/
|
||||||
|
private final AnimationListener mAnimationDoneListener = new AnimationListener() {
|
||||||
|
public void onAnimationStart(Animation animation) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onAnimationRepeat(Animation animation) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onAnimationEnd(Animation animation) {
|
||||||
|
onAnimationDone();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface definition for a callback to be invoked when a tab is triggered
|
* Interface definition for a callback to be invoked when a tab is triggered
|
||||||
* by moving it beyond a threshold.
|
* by moving it beyond a threshold.
|
||||||
@@ -274,7 +293,6 @@ public class SlidingTab extends ViewGroup {
|
|||||||
alphaAnim.setDuration(ANIM_TARGET_TIME);
|
alphaAnim.setDuration(ANIM_TARGET_TIME);
|
||||||
target.startAnimation(alphaAnim);
|
target.startAnimation(alphaAnim);
|
||||||
target.setVisibility(View.VISIBLE);
|
target.setVisibility(View.VISIBLE);
|
||||||
target.startAnimation(alphaAnim);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset(boolean animate) {
|
void reset(boolean animate) {
|
||||||
@@ -302,6 +320,9 @@ public class SlidingTab extends ViewGroup {
|
|||||||
text.offsetTopAndBottom(dy);
|
text.offsetTopAndBottom(dy);
|
||||||
tab.offsetTopAndBottom(dy);
|
tab.offsetTopAndBottom(dy);
|
||||||
}
|
}
|
||||||
|
text.clearAnimation();
|
||||||
|
tab.clearAnimation();
|
||||||
|
target.clearAnimation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,7 +427,11 @@ public class SlidingTab extends ViewGroup {
|
|||||||
public void startAnimation(Animation animation) {
|
public void startAnimation(Animation animation) {
|
||||||
tab.startAnimation(animation);
|
tab.startAnimation(animation);
|
||||||
text.startAnimation(animation);
|
text.startAnimation(animation);
|
||||||
target.setVisibility(View.GONE);
|
}
|
||||||
|
|
||||||
|
public void hideTarget() {
|
||||||
|
target.clearAnimation();
|
||||||
|
target.setVisibility(View.INVISIBLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,6 +546,16 @@ public class SlidingTab extends ViewGroup {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVisibility(int visibility) {
|
||||||
|
// Clear animations so sliders don't continue to animate when we show the widget again.
|
||||||
|
if (visibility != getVisibility() && visibility == View.INVISIBLE) {
|
||||||
|
mLeftSlider.reset(false);
|
||||||
|
mRightSlider.reset(false);
|
||||||
|
}
|
||||||
|
super.setVisibility(visibility);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent event) {
|
public boolean onTouchEvent(MotionEvent event) {
|
||||||
if (mTracking) {
|
if (mTracking) {
|
||||||
@@ -546,10 +581,11 @@ public class SlidingTab extends ViewGroup {
|
|||||||
mTriggered = true;
|
mTriggered = true;
|
||||||
mTracking = false;
|
mTracking = false;
|
||||||
mCurrentSlider.setState(Slider.STATE_ACTIVE);
|
mCurrentSlider.setState(Slider.STATE_ACTIVE);
|
||||||
dispatchTriggerEvent(mCurrentSlider == mLeftSlider ?
|
boolean isLeft = mCurrentSlider == mLeftSlider;
|
||||||
|
dispatchTriggerEvent(isLeft ?
|
||||||
OnTriggerListener.LEFT_HANDLE : OnTriggerListener.RIGHT_HANDLE);
|
OnTriggerListener.LEFT_HANDLE : OnTriggerListener.RIGHT_HANDLE);
|
||||||
|
|
||||||
startAnimating();
|
startAnimating(isLeft ? mHoldLeftOnTransition : mHoldRightOnTransition);
|
||||||
setGrabbedState(OnTriggerListener.NO_HANDLE);
|
setGrabbedState(OnTriggerListener.NO_HANDLE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -562,6 +598,7 @@ public class SlidingTab extends ViewGroup {
|
|||||||
mTriggered = false;
|
mTriggered = false;
|
||||||
mOtherSlider.show(true);
|
mOtherSlider.show(true);
|
||||||
mCurrentSlider.reset(false);
|
mCurrentSlider.reset(false);
|
||||||
|
mCurrentSlider.hideTarget();
|
||||||
mCurrentSlider = null;
|
mCurrentSlider = null;
|
||||||
mOtherSlider = null;
|
mOtherSlider = null;
|
||||||
setGrabbedState(OnTriggerListener.NO_HANDLE);
|
setGrabbedState(OnTriggerListener.NO_HANDLE);
|
||||||
@@ -572,40 +609,52 @@ public class SlidingTab extends ViewGroup {
|
|||||||
return mTracking || super.onTouchEvent(event);
|
return mTracking || super.onTouchEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void startAnimating() {
|
void startAnimating(final boolean holdAfter) {
|
||||||
mAnimating = true;
|
mAnimating = true;
|
||||||
final Animation appear = new AlphaAnimation(0.5f, 1.0f); appear.setDuration(ANIM_DURATION);
|
|
||||||
final Animation trans;
|
final Animation trans;
|
||||||
Slider slider = mCurrentSlider;
|
final Slider slider = mCurrentSlider;
|
||||||
int dx;
|
final Slider other = mOtherSlider;
|
||||||
int dy;
|
final int dx;
|
||||||
|
final int dy;
|
||||||
if (isHorizontal()) {
|
if (isHorizontal()) {
|
||||||
int right = slider.tab.getRight();
|
int right = slider.tab.getRight();
|
||||||
int width = slider.tab.getWidth();
|
int width = slider.tab.getWidth();
|
||||||
int left = slider.tab.getLeft();
|
int left = slider.tab.getLeft();
|
||||||
int viewWidth = getWidth();
|
int viewWidth = getWidth();
|
||||||
dx = slider == mRightSlider ? - (right + viewWidth - width)
|
int holdOffset = holdAfter ? 0 : width; // how much of tab to show at the end of anim
|
||||||
: (viewWidth - left) + viewWidth - width;
|
dx = slider == mRightSlider ? - (right + viewWidth - holdOffset)
|
||||||
|
: (viewWidth - left) + viewWidth - holdOffset;
|
||||||
dy = 0;
|
dy = 0;
|
||||||
} else {
|
} else {
|
||||||
int top = slider.tab.getTop();
|
int top = slider.tab.getTop();
|
||||||
int bottom = slider.tab.getBottom();
|
int bottom = slider.tab.getBottom();
|
||||||
int height = slider.tab.getHeight();
|
int height = slider.tab.getHeight();
|
||||||
int viewHeight = getHeight();
|
int viewHeight = getHeight();
|
||||||
|
int holdOffset = holdAfter ? 0 : height; // how much of tab to show at end of anim
|
||||||
dx = 0;
|
dx = 0;
|
||||||
dy = slider == mRightSlider ? (top + viewHeight - height)
|
dy = slider == mRightSlider ? (top + viewHeight - holdOffset)
|
||||||
: - ((viewHeight - bottom) + viewHeight - height);
|
: - ((viewHeight - bottom) + viewHeight - holdOffset);
|
||||||
}
|
}
|
||||||
trans = new TranslateAnimation(0, dx, 0, dy);
|
trans = new TranslateAnimation(0, dx, 0, dy);
|
||||||
trans.setDuration(ANIM_DURATION);
|
trans.setDuration(ANIM_DURATION);
|
||||||
trans.setInterpolator(new LinearInterpolator());
|
trans.setInterpolator(new LinearInterpolator());
|
||||||
|
trans.setFillAfter(true);
|
||||||
|
|
||||||
trans.setAnimationListener(new AnimationListener() {
|
trans.setAnimationListener(new AnimationListener() {
|
||||||
public void onAnimationEnd(Animation animation) {
|
public void onAnimationEnd(Animation animation) {
|
||||||
resetView();
|
Animation anim;
|
||||||
mLeftSlider.startAnimation(appear);
|
if (holdAfter) {
|
||||||
mRightSlider.startAnimation(appear);
|
anim = new TranslateAnimation(dx, dx, dy, dy);
|
||||||
|
anim.setDuration(1000); // plenty of time for transitions
|
||||||
mAnimating = false;
|
mAnimating = false;
|
||||||
|
} else {
|
||||||
|
anim = new AlphaAnimation(0.5f, 1.0f);
|
||||||
|
anim.setDuration(ANIM_DURATION);
|
||||||
|
resetView();
|
||||||
|
}
|
||||||
|
anim.setAnimationListener(mAnimationDoneListener);
|
||||||
|
mLeftSlider.startAnimation(anim);
|
||||||
|
mRightSlider.startAnimation(anim);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onAnimationRepeat(Animation animation) {
|
public void onAnimationRepeat(Animation animation) {
|
||||||
@@ -618,9 +667,15 @@ public class SlidingTab extends ViewGroup {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
slider.hideTarget();
|
||||||
slider.startAnimation(trans);
|
slider.startAnimation(trans);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onAnimationDone() {
|
||||||
|
resetView();
|
||||||
|
mAnimating = false;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean withinView(final float x, final float y, final View view) {
|
private boolean withinView(final float x, final float y, final View view) {
|
||||||
return isHorizontal() && y > - TRACKING_MARGIN && y < TRACKING_MARGIN + view.getHeight()
|
return isHorizontal() && y > - TRACKING_MARGIN && y < TRACKING_MARGIN + view.getHeight()
|
||||||
|| !isHorizontal() && x > -TRACKING_MARGIN && x < TRACKING_MARGIN + view.getWidth();
|
|| !isHorizontal() && x > -TRACKING_MARGIN && x < TRACKING_MARGIN + view.getWidth();
|
||||||
@@ -643,8 +698,6 @@ public class SlidingTab extends ViewGroup {
|
|||||||
// Center the widgets in the view
|
// Center the widgets in the view
|
||||||
mLeftSlider.layout(l, t, r, b, isHorizontal() ? Slider.ALIGN_LEFT : Slider.ALIGN_BOTTOM);
|
mLeftSlider.layout(l, t, r, b, isHorizontal() ? Slider.ALIGN_LEFT : Slider.ALIGN_BOTTOM);
|
||||||
mRightSlider.layout(l, t, r, b, isHorizontal() ? Slider.ALIGN_RIGHT : Slider.ALIGN_TOP);
|
mRightSlider.layout(l, t, r, b, isHorizontal() ? Slider.ALIGN_RIGHT : Slider.ALIGN_TOP);
|
||||||
|
|
||||||
invalidate(); // TODO: be more conservative about what we're invalidating
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void moveHandle(float x, float y) {
|
private void moveHandle(float x, float y) {
|
||||||
@@ -722,6 +775,11 @@ public class SlidingTab extends ViewGroup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setHoldAfterTrigger(boolean holdLeft, boolean holdRight) {
|
||||||
|
mHoldLeftOnTransition = holdLeft;
|
||||||
|
mHoldRightOnTransition = holdRight;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers haptic feedback.
|
* Triggers haptic feedback.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user