diff options
author | Alan Viverette <alanv@google.com> | 2014-04-21 17:30:22 -0700 |
---|---|---|
committer | Alan Viverette <alanv@google.com> | 2014-04-21 17:30:22 -0700 |
commit | c3f35b01b5a21e110ca4eedf09c8c6164ab85dfb (patch) | |
tree | cc85066d2c0100736889a4dd5c26137d2eb121c9 | |
parent | 3fafb4ebf2572578c6d7df742593ee5ed17748a8 (diff) | |
download | frameworks_base-c3f35b01b5a21e110ca4eedf09c8c6164ab85dfb.zip frameworks_base-c3f35b01b5a21e110ca4eedf09c8c6164ab85dfb.tar.gz frameworks_base-c3f35b01b5a21e110ca4eedf09c8c6164ab85dfb.tar.bz2 |
Add touch feedback to edit text
Change-Id: Id25692bfa40f5145d6ca807111bbd5d0c4774d07
-rw-r--r-- | core/java/android/view/View.java | 9 | ||||
-rw-r--r-- | core/res/res/drawable/edit_text_quantum.xml | 45 | ||||
-rw-r--r-- | graphics/java/android/graphics/drawable/Ripple.java | 32 | ||||
-rw-r--r-- | graphics/java/android/graphics/drawable/TouchFeedbackDrawable.java | 14 |
4 files changed, 61 insertions, 39 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1f9ba46..be316e2 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -4737,13 +4737,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private void manageFocusHotspot(boolean focused, View v) { if (mBackground != null && mBackground.supportsHotspots()) { final Rect r = new Rect(); - if (v != null) { + if (!focused && v != null) { v.getBoundsOnScreen(r); final int[] location = new int[2]; getLocationOnScreen(location); r.offset(-location[0], -location[1]); } else { - r.set(mLeft, mTop, mRight, mBottom); + r.set(0, 0, mRight - mLeft, mBottom - mTop); } final float x = r.exactCenterX(); @@ -4858,16 +4858,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if ((mPrivateFlags & PFLAG_FOCUSED) != 0) { mPrivateFlags &= ~PFLAG_FOCUSED; - if (hasFocus()) { - manageFocusHotspot(false, focused); - } - if (propagate && mParent != null) { mParent.clearChildFocus(this); } onFocusChanged(false, 0, null); + manageFocusHotspot(false, focused); refreshDrawableState(); if (propagate && (!refocus || !rootViewRequestFocus())) { diff --git a/core/res/res/drawable/edit_text_quantum.xml b/core/res/res/drawable/edit_text_quantum.xml index d1f9831..c42c7b7 100644 --- a/core/res/res/drawable/edit_text_quantum.xml +++ b/core/res/res/drawable/edit_text_quantum.xml @@ -14,29 +14,26 @@ limitations under the License. --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_window_focused="false" android:state_enabled="true"> - <nine-patch android:src="@drawable/textfield_default_qntm_alpha" - android:tint="?attr/colorControlNormal" /> - </item> - <item android:state_window_focused="false" android:state_enabled="false"> - <nine-patch android:src="@drawable/textfield_default_qntm_alpha" - android:tint="?attr/colorControlNormal" /> - </item> - <item android:state_enabled="true" android:state_focused="true"> - <nine-patch android:src="@drawable/textfield_activated_qntm_alpha" - android:tint="?attr/colorControlActivated" /> - </item> - <item android:state_enabled="true" android:state_activated="true"> - <nine-patch android:src="@drawable/textfield_activated_qntm_alpha" - android:tint="?attr/colorControlActivated" /> - </item> - <item android:state_enabled="true"> - <nine-patch android:src="@drawable/textfield_default_qntm_alpha" - android:tint="?attr/colorControlNormal" /> - </item> +<touch-feedback xmlns:android="http://schemas.android.com/apk/res/android" + android:tint="?attr/colorControlActivated"> <item> - <nine-patch android:src="@drawable/textfield_default_qntm_alpha" - android:tint="?attr/colorControlNormal" /> + <selector> + <item android:state_window_focused="false"> + <nine-patch android:src="@drawable/textfield_default_qntm_alpha" + android:tint="?attr/colorControlNormal" /> + </item> + <item android:state_enabled="false"> + <nine-patch android:src="@drawable/textfield_default_qntm_alpha" + android:tint="?attr/colorControlNormal" /> + </item> + <item android:state_focused="false" android:state_activated="false"> + <nine-patch android:src="@drawable/textfield_default_qntm_alpha" + android:tint="?attr/colorControlNormal" /> + </item> + <item> + <nine-patch android:src="@drawable/textfield_activated_qntm_alpha" + android:tint="?attr/colorControlNormal" /> + </item> + </selector> </item> -</selector> +</touch-feedback> diff --git a/graphics/java/android/graphics/drawable/Ripple.java b/graphics/java/android/graphics/drawable/Ripple.java index 03dd841..796da50 100644 --- a/graphics/java/android/graphics/drawable/Ripple.java +++ b/graphics/java/android/graphics/drawable/Ripple.java @@ -62,27 +62,31 @@ class Ripple { /** Whether the center is within the parent bounds. */ private boolean mInside; + + /** Whether to pulse this ripple. */ + boolean mPulse; /** Enter state. A value in [0...1] or -1 if not set. */ - private float mEnterState = -1; + float mEnterState = -1; /** Exit state. A value in [0...1] or -1 if not set. */ - private float mExitState = -1; + float mExitState = -1; /** Outside state. A value in [0...1] or -1 if not set. */ - private float mOutsideState = -1; + float mOutsideState = -1; /** Pulse state. A value in [0...1] or -1 if not set. */ - private float mPulseState = -1; + float mPulseState = -1; /** * Creates a new ripple with the specified parent bounds, padding, initial * position, and screen density. */ - public Ripple(Rect bounds, Rect padding, float x, float y, float density) { + public Ripple(Rect bounds, Rect padding, float x, float y, float density, boolean pulse) { mBounds = bounds; mPadding = padding; mInside = mBounds.contains((int) x, (int) y); + mPulse = pulse; mX = x; mY = y; @@ -115,6 +119,16 @@ class Ripple { } } + public void onBoundsChanged() { + final boolean inside = mBounds.contains((int) mX, (int) mY); + if (mInside != inside) { + if (mAnimator != null) { + mAnimator.outside(); + } + mInside = inside; + } + } + public RippleAnimator animate() { if (mAnimator == null) { mAnimator = new RippleAnimator(this); @@ -308,9 +322,11 @@ class Ripple { MathUtils.constrain((currentTime - mOutsideTime) / (float) OUTSIDE_DURATION, 0, 1)); // Pulse is a little more complicated. - final long pulseTime = (currentTime - mEnterTime - ENTER_DURATION - PULSE_DELAY); - mTarget.mPulseState = pulseTime < 0 ? -1 - : (pulseTime % (PULSE_INTERVAL + PULSE_DURATION)) / (float) PULSE_DURATION; + if (mTarget.mPulse) { + final long pulseTime = (currentTime - mEnterTime - ENTER_DURATION - PULSE_DELAY); + mTarget.mPulseState = pulseTime < 0 ? -1 + : (pulseTime % (PULSE_INTERVAL + PULSE_DURATION)) / (float) PULSE_DURATION; + } } } } diff --git a/graphics/java/android/graphics/drawable/TouchFeedbackDrawable.java b/graphics/java/android/graphics/drawable/TouchFeedbackDrawable.java index cf08031..813d755 100644 --- a/graphics/java/android/graphics/drawable/TouchFeedbackDrawable.java +++ b/graphics/java/android/graphics/drawable/TouchFeedbackDrawable.java @@ -112,6 +112,16 @@ public class TouchFeedbackDrawable extends LayerDrawable { } @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + + final int N = mActiveRipplesCount; + for (int i = 0; i < N; i++) { + mActiveRipples[i].onBoundsChanged(); + } + } + + @Override public boolean setVisible(boolean visible, boolean restart) { if (!visible) { if (mTouchedRipples != null) { @@ -291,7 +301,9 @@ public class TouchFeedbackDrawable extends LayerDrawable { y = bounds.exactCenterY(); } - final Ripple newRipple = new Ripple(bounds, padding, x, y, mDensity); + // TODO: Clean this up in the API. + final boolean pulse = (id != R.attr.state_focused); + final Ripple newRipple = new Ripple(bounds, padding, x, y, mDensity, pulse); newRipple.animate().enter(); mActiveRipples[mActiveRipplesCount++] = newRipple; |