diff options
| -rw-r--r-- | core/java/android/view/View.java | 40 | ||||
| -rw-r--r-- | core/java/android/view/ViewGroup.java | 26 | ||||
| -rw-r--r-- | core/java/android/widget/AbsListView.java | 8 | ||||
| -rw-r--r-- | core/java/android/widget/ListView.java | 1 | ||||
| -rw-r--r-- | core/java/android/widget/ScrollView.java | 70 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 18 |
6 files changed, 126 insertions, 37 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 2eb633f..f6f5235 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3650,14 +3650,27 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** - * This is called when a container is going to temporarily detach a child - * that currently has focus, with + * @hide + */ + public void dispatchStartTemporaryDetach() { + onStartTemporaryDetach(); + } + + /** + * This is called when a container is going to temporarily detach a child, with * {@link ViewGroup#detachViewFromParent(View) ViewGroup.detachViewFromParent}. * It will either be followed by {@link #onFinishTemporaryDetach()} or - * {@link #onDetachedFromWindow()} when the container is done. Generally - * this is currently only done ListView for a view with focus. + * {@link #onDetachedFromWindow()} when the container is done. */ public void onStartTemporaryDetach() { + removeUnsetPressCallback(); + } + + /** + * @hide + */ + public void dispatchFinishTemporaryDetach() { + onFinishTemporaryDetach(); } /** @@ -4362,6 +4375,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** + * Remove the prepress detection timer. + */ + private void removeUnsetPressCallback() { + if ((mPrivateFlags & PRESSED) != 0 && mUnsetPressedState != null) { + setPressed(false); + removeCallbacks(mUnsetPressedState); + } + } + + /** * Remove the tap detection timer. */ private void removeTapCallback() { @@ -5886,6 +5909,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @see #onAttachedToWindow() */ protected void onDetachedFromWindow() { + removeUnsetPressCallback(); removeLongPressCallback(); destroyDrawingCache(); } @@ -8731,7 +8755,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility boolean clampedX, boolean clampedY) { // Intentionally empty. } - + /** * A MeasureSpec encapsulates the layout requirements passed from parent to child. * Each MeasureSpec represents a requirement for either the width or the height. @@ -9182,12 +9206,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility boolean mRecomputeGlobalAttributes; /** - * Set to true when attributes (like mKeepScreenOn) need to be - * recomputed. - */ - boolean mAttributesChanged; - - /** * Set during a traveral if any views want to keep the screen on. */ boolean mKeepScreenOn; diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 0663215..aac1068 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -1065,6 +1065,32 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } return false; } + + /** + * {@inheritDoc} + */ + @Override + public void dispatchStartTemporaryDetach() { + super.dispatchStartTemporaryDetach(); + final int count = mChildrenCount; + final View[] children = mChildren; + for (int i = 0; i < count; i++) { + children[i].dispatchStartTemporaryDetach(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void dispatchFinishTemporaryDetach() { + super.dispatchFinishTemporaryDetach(); + final int count = mChildrenCount; + final View[] children = mChildren; + for (int i = 0; i < count; i++) { + children[i].dispatchFinishTemporaryDetach(); + } + } /** * {@inheritDoc} diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 17d5bb7..9ddfeff 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1314,7 +1314,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te position, -1); } } else { - isScrap[0] = true; + isScrap[0] = true; + child.dispatchFinishTemporaryDetach(); } } else { child = mAdapter.getView(position, null, this); @@ -4145,8 +4146,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } if (mViewTypeCount == 1) { + scrap.dispatchStartTemporaryDetach(); mCurrentScrap.add(scrap); } else { + scrap.dispatchStartTemporaryDetach(); mScrapViews[viewType].add(scrap); } @@ -4165,7 +4168,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te ArrayList<View> scrapViews = mCurrentScrap; final int count = activeViews.length; - for (int i = 0; i < count; ++i) { + for (int i = count - 1; i >= 0; i--) { final View victim = activeViews[i]; if (victim != null) { int whichScrap = ((AbsListView.LayoutParams) victim.getLayoutParams()).viewType; @@ -4181,6 +4184,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te if (multipleScraps) { scrapViews = mScrapViews[whichScrap]; } + victim.dispatchStartTemporaryDetach(); scrapViews.add(victim); if (hasListener) { diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 2feed03..8d688a5 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -1485,7 +1485,6 @@ public class ListView extends AbsListView { } // Clear out old views - //removeAllViewsInLayout(); detachAllViewsFromParent(); switch (mLayoutMode) { diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 52ed11d..bb3b07e 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Rect; import android.util.AttributeSet; +import android.util.Log; import android.view.FocusFinder; import android.view.KeyEvent; import android.view.MotionEvent; @@ -51,6 +52,8 @@ import java.util.List; * <p>ScrollView only supports vertical scrolling. */ public class ScrollView extends FrameLayout { + private static final String TAG = "ScrollView"; + static final int ANIMATED_SCROLL_GAP = 250; static final float MAX_SCROLL_FACTOR = 0.5f; @@ -360,6 +363,17 @@ public class ScrollView extends FrameLayout { return handled; } + private boolean inChild(int x, int y) { + if (getChildCount() > 0) { + final View child = getChildAt(0); + return !(y < child.getTop() + || y >= child.getBottom() + || x < child.getLeft() + || x >= child.getRight()); + } + return false; + } + @Override public boolean onInterceptTouchEvent(MotionEvent ev) { /* @@ -399,6 +413,11 @@ public class ScrollView extends FrameLayout { break; case MotionEvent.ACTION_DOWN: + if (!inChild((int)ev.getX(), (int)y)) { + mIsBeingDragged = false; + break; + } + /* Remember location of down touch */ mLastMotionY = y; @@ -451,36 +470,45 @@ public class ScrollView extends FrameLayout { mScroller.abortAnimation(); } + if (!inChild((int)ev.getX(), (int)y)) { + mIsBeingDragged = false; + return false; + } + // Remember where the motion event started mLastMotionY = y; break; case MotionEvent.ACTION_MOVE: - // Scroll to follow the motion event - final int deltaY = (int) (mLastMotionY - y); - mLastMotionY = y; + if (mIsBeingDragged) { + // Scroll to follow the motion event + final int deltaY = (int) (mLastMotionY - y); + mLastMotionY = y; - overscrollBy(0, deltaY, 0, mScrollY, 0, getScrollRange(), - 0, getOverscrollMax()); - break; + overscrollBy(0, deltaY, 0, mScrollY, 0, getScrollRange(), + 0, getOverscrollMax()); + break; + } case MotionEvent.ACTION_UP: - final VelocityTracker velocityTracker = mVelocityTracker; - velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); - int initialVelocity = (int) velocityTracker.getYVelocity(); - - if (getChildCount() > 0) { - if ((Math.abs(initialVelocity) > mMinimumVelocity)) { - fling(-initialVelocity); - } else { - final int bottom = getScrollRange(); - if (mScroller.springback(mScrollX, mScrollY, 0, 0, 0, bottom)) { - invalidate(); + if (mIsBeingDragged) { + final VelocityTracker velocityTracker = mVelocityTracker; + velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); + int initialVelocity = (int) velocityTracker.getYVelocity(); + + if (getChildCount() > 0) { + if ((Math.abs(initialVelocity) > mMinimumVelocity)) { + fling(-initialVelocity); + } else { + final int bottom = getScrollRange(); + if (mScroller.springback(mScrollX, mScrollY, 0, 0, 0, bottom)) { + invalidate(); + } } } - } - if (mVelocityTracker != null) { - mVelocityTracker.recycle(); - mVelocityTracker = null; + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } } } return true; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index cea6d3b..cb44fa8 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -198,6 +198,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private boolean mFreezesText; private boolean mFrozenWithFocus; private boolean mTemporaryDetach; + private boolean mDispatchTemporaryDetach; private boolean mEatTouchRelease = false; private boolean mScrolled = false; @@ -6372,13 +6373,26 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } @Override + public void dispatchFinishTemporaryDetach() { + mDispatchTemporaryDetach = true; + super.dispatchFinishTemporaryDetach(); + mDispatchTemporaryDetach = false; + } + + @Override public void onStartTemporaryDetach() { - mTemporaryDetach = true; + super.onStartTemporaryDetach(); + // Only track when onStartTemporaryDetach() is called directly, + // usually because this instance is an editable field in a list + if (!mDispatchTemporaryDetach) mTemporaryDetach = true; } @Override public void onFinishTemporaryDetach() { - mTemporaryDetach = false; + super.onFinishTemporaryDetach(); + // Only track when onStartTemporaryDetach() is called directly, + // usually because this instance is an editable field in a list + if (!mDispatchTemporaryDetach) mTemporaryDetach = false; } @Override |
