Merge "Change snap behavior for lock screen" into jb-dev

This commit is contained in:
Michael Jurka
2012-06-14 11:39:21 -07:00
committed by Android (Google) Code Review
13 changed files with 38 additions and 84 deletions

View File

@ -115,7 +115,6 @@ public class GlowPadView extends View {
private int mMaxTargetWidth; private int mMaxTargetWidth;
private float mOuterRadius = 0.0f; private float mOuterRadius = 0.0f;
private float mHitRadius = 0.0f;
private float mSnapMargin = 0.0f; private float mSnapMargin = 0.0f;
private boolean mDragging; private boolean mDragging;
private int mNewTargetResources; private int mNewTargetResources;
@ -211,7 +210,6 @@ public class GlowPadView extends View {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GlowPadView); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GlowPadView);
mInnerRadius = a.getDimension(R.styleable.GlowPadView_innerRadius, mInnerRadius); mInnerRadius = a.getDimension(R.styleable.GlowPadView_innerRadius, mInnerRadius);
mOuterRadius = a.getDimension(R.styleable.GlowPadView_outerRadius, mOuterRadius); mOuterRadius = a.getDimension(R.styleable.GlowPadView_outerRadius, mOuterRadius);
mHitRadius = a.getDimension(R.styleable.GlowPadView_hitRadius, mHitRadius);
mSnapMargin = a.getDimension(R.styleable.GlowPadView_snapMargin, mSnapMargin); mSnapMargin = a.getDimension(R.styleable.GlowPadView_snapMargin, mSnapMargin);
mVibrationDuration = a.getInt(R.styleable.GlowPadView_vibrationDuration, mVibrationDuration = a.getInt(R.styleable.GlowPadView_vibrationDuration,
mVibrationDuration); mVibrationDuration);
@ -280,7 +278,6 @@ public class GlowPadView extends View {
private void dump() { private void dump() {
Log.v(TAG, "Outer Radius = " + mOuterRadius); Log.v(TAG, "Outer Radius = " + mOuterRadius);
Log.v(TAG, "HitRadius = " + mHitRadius);
Log.v(TAG, "SnapMargin = " + mSnapMargin); Log.v(TAG, "SnapMargin = " + mSnapMargin);
Log.v(TAG, "FeedbackCount = " + mFeedbackCount); Log.v(TAG, "FeedbackCount = " + mFeedbackCount);
Log.v(TAG, "VibrationDuration = " + mVibrationDuration); Log.v(TAG, "VibrationDuration = " + mVibrationDuration);
@ -799,7 +796,6 @@ public class GlowPadView extends View {
final int historySize = event.getHistorySize(); final int historySize = event.getHistorySize();
ArrayList<TargetDrawable> targets = mTargetDrawables; ArrayList<TargetDrawable> targets = mTargetDrawables;
int ntargets = targets.size(); int ntargets = targets.size();
final boolean singleTarget = ntargets == 1;
float x = 0.0f; float x = 0.0f;
float y = 0.0f; float y = 0.0f;
for (int k = 0; k < historySize + 1; k++) { for (int k = 0; k < historySize + 1; k++) {
@ -812,31 +808,29 @@ public class GlowPadView extends View {
final float scale = touchRadius > mOuterRadius ? mOuterRadius / touchRadius : 1.0f; final float scale = touchRadius > mOuterRadius ? mOuterRadius / touchRadius : 1.0f;
float limitX = tx * scale; float limitX = tx * scale;
float limitY = ty * scale; float limitY = ty * scale;
double angleRad = Math.atan2(-ty, tx);
if (!mDragging) { if (!mDragging) {
trySwitchToFirstTouchState(eventX, eventY); trySwitchToFirstTouchState(eventX, eventY);
} }
if (mDragging) { if (mDragging) {
if (singleTarget) { // For multiple targets, snap to the one that matches
// Snap to outer ring if there's only one target final float snapRadius = mOuterRadius - mSnapMargin;
float snapRadius = mOuterRadius - mSnapMargin; final float snapDistance2 = snapRadius * snapRadius;
if (touchRadius > snapRadius) { // Find first target in range
activeTarget = 0; for (int i = 0; i < ntargets; i++) {
} TargetDrawable target = targets.get(i);
} else {
// For more than one target, snap to the closest one less than hitRadius away. double targetMinRad = (i - 0.5) * 2 * Math.PI / ntargets;
float best = Float.MAX_VALUE; double targetMaxRad = (i + 0.5) * 2 * Math.PI / ntargets;
final float hitRadius2 = mHitRadius * mHitRadius; if (target.isEnabled()) {
// Find first target in range boolean angleMatches =
for (int i = 0; i < ntargets; i++) { (angleRad > targetMinRad && angleRad <= targetMaxRad) ||
TargetDrawable target = targets.get(i); (angleRad + 2 * Math.PI > targetMinRad &&
float dx = limitX - target.getX(); angleRad + 2 * Math.PI <= targetMaxRad);
float dy = limitY - target.getY(); if (angleMatches && (dist2(tx, ty) > snapDistance2)) {
float dist2 = dx*dx + dy*dy;
if (target.isEnabled() && dist2 < hitRadius2 && dist2 < best) {
activeTarget = i; activeTarget = i;
best = dist2;
} }
} }
} }
@ -851,10 +845,7 @@ public class GlowPadView extends View {
if (activeTarget != -1) { if (activeTarget != -1) {
switchToState(STATE_SNAP, x,y); switchToState(STATE_SNAP, x,y);
TargetDrawable target = targets.get(activeTarget); updateGlowPosition(x, y);
final float newX = singleTarget ? x : target.getX();
final float newY = singleTarget ? y : target.getY();
updateGlowPosition(newX, newY);
} else { } else {
switchToState(STATE_TRACKING, x, y); switchToState(STATE_TRACKING, x, y);
updateGlowPosition(x, y); updateGlowPosition(x, y);
@ -942,10 +933,6 @@ public class GlowPadView extends View {
if (mOuterRadius == 0.0f) { if (mOuterRadius == 0.0f) {
mOuterRadius = Math.max(mOuterRing.getWidth(), mOuterRing.getHeight())/2.0f; mOuterRadius = Math.max(mOuterRing.getWidth(), mOuterRing.getHeight())/2.0f;
} }
if (mHitRadius == 0.0f) {
// Use the radius of inscribed circle of the first target.
mHitRadius = mTargetDrawables.get(0).getWidth() / 2.0f;
}
if (mSnapMargin == 0.0f) { if (mSnapMargin == 0.0f) {
mSnapMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mSnapMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
SNAP_MARGIN_DEFAULT, getContext().getResources().getDisplayMetrics()); SNAP_MARGIN_DEFAULT, getContext().getResources().getDisplayMetrics());

View File

@ -119,7 +119,6 @@ public class MultiWaveView extends View {
private int mMaxTargetWidth; private int mMaxTargetWidth;
private float mOuterRadius = 0.0f; private float mOuterRadius = 0.0f;
private float mHitRadius = 0.0f;
private float mSnapMargin = 0.0f; private float mSnapMargin = 0.0f;
private boolean mDragging; private boolean mDragging;
private int mNewTargetResources; private int mNewTargetResources;
@ -213,7 +212,6 @@ public class MultiWaveView extends View {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MultiWaveView); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MultiWaveView);
mOuterRadius = a.getDimension(R.styleable.MultiWaveView_outerRadius, mOuterRadius); mOuterRadius = a.getDimension(R.styleable.MultiWaveView_outerRadius, mOuterRadius);
mHitRadius = a.getDimension(R.styleable.MultiWaveView_hitRadius, mHitRadius);
mSnapMargin = a.getDimension(R.styleable.MultiWaveView_snapMargin, mSnapMargin); mSnapMargin = a.getDimension(R.styleable.MultiWaveView_snapMargin, mSnapMargin);
mVibrationDuration = a.getInt(R.styleable.MultiWaveView_vibrationDuration, mVibrationDuration = a.getInt(R.styleable.MultiWaveView_vibrationDuration,
mVibrationDuration); mVibrationDuration);
@ -277,7 +275,6 @@ public class MultiWaveView extends View {
private void dump() { private void dump() {
Log.v(TAG, "Outer Radius = " + mOuterRadius); Log.v(TAG, "Outer Radius = " + mOuterRadius);
Log.v(TAG, "HitRadius = " + mHitRadius);
Log.v(TAG, "SnapMargin = " + mSnapMargin); Log.v(TAG, "SnapMargin = " + mSnapMargin);
Log.v(TAG, "FeedbackCount = " + mFeedbackCount); Log.v(TAG, "FeedbackCount = " + mFeedbackCount);
Log.v(TAG, "VibrationDuration = " + mVibrationDuration); Log.v(TAG, "VibrationDuration = " + mVibrationDuration);
@ -823,7 +820,6 @@ public class MultiWaveView extends View {
final int historySize = event.getHistorySize(); final int historySize = event.getHistorySize();
ArrayList<TargetDrawable> targets = mTargetDrawables; ArrayList<TargetDrawable> targets = mTargetDrawables;
int ntargets = targets.size(); int ntargets = targets.size();
final boolean singleTarget = ntargets == 1;
float x = 0.0f; float x = 0.0f;
float y = 0.0f; float y = 0.0f;
for (int k = 0; k < historySize + 1; k++) { for (int k = 0; k < historySize + 1; k++) {
@ -836,31 +832,29 @@ public class MultiWaveView extends View {
final float scale = touchRadius > mOuterRadius ? mOuterRadius / touchRadius : 1.0f; final float scale = touchRadius > mOuterRadius ? mOuterRadius / touchRadius : 1.0f;
float limitX = tx * scale; float limitX = tx * scale;
float limitY = ty * scale; float limitY = ty * scale;
double angleRad = Math.atan2(-ty, tx);
if (!mDragging) { if (!mDragging) {
trySwitchToFirstTouchState(eventX, eventY); trySwitchToFirstTouchState(eventX, eventY);
} }
if (mDragging) { if (mDragging) {
if (singleTarget) { // For multiple targets, snap to the one that matches
// Snap to outer ring if there's only one target final float snapRadius = mOuterRadius - mSnapMargin;
float snapRadius = mOuterRadius - mSnapMargin; final float snapDistance2 = snapRadius * snapRadius;
if (touchRadius > snapRadius) { // Find first target in range
activeTarget = 0; for (int i = 0; i < ntargets; i++) {
} TargetDrawable target = targets.get(i);
} else {
// For more than one target, snap to the closest one less than hitRadius away. double targetMinRad = (i - 0.5) * 2 * Math.PI / ntargets;
float best = Float.MAX_VALUE; double targetMaxRad = (i + 0.5) * 2 * Math.PI / ntargets;
final float hitRadius2 = mHitRadius * mHitRadius; if (target.isEnabled()) {
// Find first target in range boolean angleMatches =
for (int i = 0; i < ntargets; i++) { (angleRad > targetMinRad && angleRad <= targetMaxRad) ||
TargetDrawable target = targets.get(i); (angleRad + 2 * Math.PI > targetMinRad &&
float dx = limitX - target.getX(); angleRad + 2 * Math.PI <= targetMaxRad);
float dy = limitY - target.getY(); if (angleMatches && (dist2(tx, ty) > snapDistance2)) {
float dist2 = dx*dx + dy*dy;
if (target.isEnabled() && dist2 < hitRadius2 && dist2 < best) {
activeTarget = i; activeTarget = i;
best = dist2;
} }
} }
} }
@ -875,10 +869,7 @@ public class MultiWaveView extends View {
if (activeTarget != -1) { if (activeTarget != -1) {
switchToState(STATE_SNAP, x,y); switchToState(STATE_SNAP, x,y);
TargetDrawable target = targets.get(activeTarget); moveHandleTo(x, y, false);
final float newX = singleTarget ? x : target.getX();
final float newY = singleTarget ? y : target.getY();
moveHandleTo(newX, newY, false);
} else { } else {
switchToState(STATE_TRACKING, x, y); switchToState(STATE_TRACKING, x, y);
moveHandleTo(x, y, false); moveHandleTo(x, y, false);
@ -972,10 +963,6 @@ public class MultiWaveView extends View {
if (mOuterRadius == 0.0f) { if (mOuterRadius == 0.0f) {
mOuterRadius = Math.max(mOuterRing.getWidth(), mOuterRing.getHeight())/2.0f; mOuterRadius = Math.max(mOuterRing.getWidth(), mOuterRing.getHeight())/2.0f;
} }
if (mHitRadius == 0.0f) {
// Use the radius of inscribed circle of the first target.
mHitRadius = mTargetDrawables.get(0).getWidth() / 2.0f;
}
if (mSnapMargin == 0.0f) { if (mSnapMargin == 0.0f) {
mSnapMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mSnapMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
SNAP_MARGIN_DEFAULT, getContext().getResources().getDisplayMetrics()); SNAP_MARGIN_DEFAULT, getContext().getResources().getDisplayMetrics());

View File

@ -98,7 +98,6 @@
android:outerRadius="@dimen/glowpadview_target_placement_radius" android:outerRadius="@dimen/glowpadview_target_placement_radius"
android:innerRadius="@dimen/glowpadview_inner_radius" android:innerRadius="@dimen/glowpadview_inner_radius"
android:snapMargin="@dimen/glowpadview_snap_margin" android:snapMargin="@dimen/glowpadview_snap_margin"
android:hitRadius="@dimen/glowpadview_hit_radius"
android:feedbackCount="1" android:feedbackCount="1"
android:vibrationDuration="20" android:vibrationDuration="20"
android:glowRadius="@dimen/glowpadview_glow_radius" android:glowRadius="@dimen/glowpadview_glow_radius"

View File

@ -98,7 +98,6 @@
android:outerRadius="@dimen/glowpadview_target_placement_radius" android:outerRadius="@dimen/glowpadview_target_placement_radius"
android:innerRadius="@dimen/glowpadview_inner_radius" android:innerRadius="@dimen/glowpadview_inner_radius"
android:snapMargin="@dimen/glowpadview_snap_margin" android:snapMargin="@dimen/glowpadview_snap_margin"
android:hitRadius="@dimen/glowpadview_hit_radius"
android:feedbackCount="1" android:feedbackCount="1"
android:vibrationDuration="20" android:vibrationDuration="20"
android:glowRadius="@dimen/glowpadview_glow_radius" android:glowRadius="@dimen/glowpadview_glow_radius"

View File

@ -139,7 +139,6 @@
android:outerRadius="@dimen/glowpadview_target_placement_radius" android:outerRadius="@dimen/glowpadview_target_placement_radius"
android:innerRadius="@dimen/glowpadview_inner_radius" android:innerRadius="@dimen/glowpadview_inner_radius"
android:snapMargin="@dimen/glowpadview_snap_margin" android:snapMargin="@dimen/glowpadview_snap_margin"
android:hitRadius="@dimen/glowpadview_hit_radius"
android:feedbackCount="1" android:feedbackCount="1"
android:vibrationDuration="20" android:vibrationDuration="20"
android:glowRadius="@dimen/glowpadview_glow_radius" android:glowRadius="@dimen/glowpadview_glow_radius"

View File

@ -144,7 +144,6 @@
android:outerRadius="@dimen/glowpadview_target_placement_radius" android:outerRadius="@dimen/glowpadview_target_placement_radius"
android:innerRadius="@dimen/glowpadview_inner_radius" android:innerRadius="@dimen/glowpadview_inner_radius"
android:snapMargin="@dimen/glowpadview_snap_margin" android:snapMargin="@dimen/glowpadview_snap_margin"
android:hitRadius="@dimen/glowpadview_hit_radius"
android:feedbackCount="1" android:feedbackCount="1"
android:vibrationDuration="20" android:vibrationDuration="20"
android:glowRadius="@dimen/glowpadview_glow_radius" android:glowRadius="@dimen/glowpadview_glow_radius"

View File

@ -5405,9 +5405,6 @@
<!-- Outer radius of glow area. Target icons will be drawn on this circle. --> <!-- Outer radius of glow area. Target icons will be drawn on this circle. -->
<attr name="outerRadius"/> <attr name="outerRadius"/>
<!-- Size of target radius. Points within this distance of target center is a "hit". -->
<attr name="hitRadius"/>
<!-- Radius of glow under finger. --> <!-- Radius of glow under finger. -->
<attr name="glowRadius" format="dimension" /> <attr name="glowRadius" format="dimension" />
@ -5450,9 +5447,6 @@
<!-- Outer radius of target circle. Icons will be drawn on this circle. --> <!-- Outer radius of target circle. Icons will be drawn on this circle. -->
<attr name="outerRadius" format="dimension" /> <attr name="outerRadius" format="dimension" />
<!-- Size of target radius. Points within this distance of target center is a "hit". -->
<attr name="hitRadius" format="dimension" />
<!-- Tactile feedback duration for actions. Set to '0' for no vibration. --> <!-- Tactile feedback duration for actions. Set to '0' for no vibration. -->
<attr name="vibrationDuration" format="integer"/> <attr name="vibrationDuration" format="integer"/>

View File

@ -79,11 +79,8 @@
<!-- Default glow radius for GlowPadView --> <!-- Default glow radius for GlowPadView -->
<dimen name="glowpadview_glow_radius">75dip</dimen> <dimen name="glowpadview_glow_radius">75dip</dimen>
<!-- Default distance beyond which GlowPadView snaps to the target radius --> <!-- Default distance beyond which GlowPadView snaps to the matching target -->
<dimen name="glowpadview_snap_margin">20dip</dimen> <dimen name="glowpadview_snap_margin">40dip</dimen>
<!-- Default distance from each snap target that GlowPadView considers a "hit" -->
<dimen name="glowpadview_hit_radius">60dip</dimen>
<!-- Default distance from each snap target that GlowPadView considers a "hit" --> <!-- Default distance from each snap target that GlowPadView considers a "hit" -->
<dimen name="glowpadview_inner_radius">15dip</dimen> <dimen name="glowpadview_inner_radius">15dip</dimen>

View File

@ -54,7 +54,6 @@
prvandroid:outerRadius="@dimen/navbar_search_outerring_radius" prvandroid:outerRadius="@dimen/navbar_search_outerring_radius"
prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius" prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:snapMargin="@dimen/navbar_search_snap_margin"
prvandroid:hitRadius="@dimen/navbar_search_hit_radius"
prvandroid:feedbackCount="0" prvandroid:feedbackCount="0"
prvandroid:vibrationDuration="@integer/config_vibration_duration" prvandroid:vibrationDuration="@integer/config_vibration_duration"
prvandroid:alwaysTrackFinger="true" prvandroid:alwaysTrackFinger="true"

View File

@ -54,7 +54,6 @@
prvandroid:outerRadius="@dimen/navbar_search_outerring_radius" prvandroid:outerRadius="@dimen/navbar_search_outerring_radius"
prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius" prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:snapMargin="@dimen/navbar_search_snap_margin"
prvandroid:hitRadius="@dimen/navbar_search_hit_radius"
prvandroid:feedbackCount="0" prvandroid:feedbackCount="0"
prvandroid:vibrationDuration="@integer/config_vibration_duration" prvandroid:vibrationDuration="@integer/config_vibration_duration"
prvandroid:alwaysTrackFinger="true" prvandroid:alwaysTrackFinger="true"

View File

@ -40,7 +40,6 @@
prvandroid:outerRadius="@dimen/navbar_search_outerring_radius" prvandroid:outerRadius="@dimen/navbar_search_outerring_radius"
prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius" prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:snapMargin="@dimen/navbar_search_snap_margin"
prvandroid:hitRadius="@dimen/navbar_search_hit_radius"
prvandroid:feedbackCount="0" prvandroid:feedbackCount="0"
prvandroid:vibrationDuration="@integer/config_vibration_duration" prvandroid:vibrationDuration="@integer/config_vibration_duration"
prvandroid:alwaysTrackFinger="true" prvandroid:alwaysTrackFinger="true"

View File

@ -41,7 +41,6 @@
prvandroid:outerRadius="@dimen/navbar_search_outerring_radius" prvandroid:outerRadius="@dimen/navbar_search_outerring_radius"
prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius" prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:snapMargin="@dimen/navbar_search_snap_margin"
prvandroid:hitRadius="@dimen/navbar_search_hit_radius"
prvandroid:feedbackCount="0" prvandroid:feedbackCount="0"
prvandroid:vibrationDuration="@integer/config_vibration_duration" prvandroid:vibrationDuration="@integer/config_vibration_duration"
prvandroid:alwaysTrackFinger="true" prvandroid:alwaysTrackFinger="true"

View File

@ -110,11 +110,8 @@
<!-- The width of the view containing the menu status bar icon --> <!-- The width of the view containing the menu status bar icon -->
<dimen name="navigation_menu_key_width">40dip</dimen> <dimen name="navigation_menu_key_width">40dip</dimen>
<!-- Default distance beyond which snaps to the target radius --> <!-- Default distance beyond which snaps to the matching target -->
<dimen name="navbar_search_snap_margin">20dip</dimen> <dimen name="navbar_search_snap_margin">40dip</dimen>
<!-- Default distance from each snap target considers a "hit" -->
<dimen name="navbar_search_hit_radius">60dip</dimen>
<!-- Diameter of outer shape drawable shown in navbar search--> <!-- Diameter of outer shape drawable shown in navbar search-->
<dimen name="navbar_search_outerring_diameter">340dp</dimen> <dimen name="navbar_search_outerring_diameter">340dp</dimen>