Skip to content

Commit 828e56e

Browse files
committed
Squish!
Take touch point size into account during the detection of scaling gestures. Average together the major/minor axes of the size. Add a config resource for tuning the minimum span requred to begin (or end) a scale. This may be altered in a device-specific overlay for devices that deviate too far from their assigned density bucket. Change-Id: I2986888e9427a7e4cb56717d59c4fa7858ba9ca7
1 parent d65afc6 commit 828e56e

File tree

3 files changed

+19
-4
lines changed

3 files changed

+19
-4
lines changed

core/java/android/view/ScaleGestureDetector.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ public void onScaleEnd(ScaleGestureDetector detector) {
137137
private long mPrevTime;
138138
private boolean mInProgress;
139139
private int mSpanSlop;
140+
private int mMinSpan;
140141

141142
/**
142143
* Consistency verifier for debugging purposes.
@@ -149,6 +150,8 @@ public ScaleGestureDetector(Context context, OnScaleGestureListener listener) {
149150
mContext = context;
150151
mListener = listener;
151152
mSpanSlop = ViewConfiguration.get(context).getScaledTouchSlop() * 2;
153+
mMinSpan = context.getResources().getDimensionPixelSize(
154+
com.android.internal.R.dimen.config_minScalingSpan);
152155
}
153156

154157
/**
@@ -209,8 +212,12 @@ public boolean onTouchEvent(MotionEvent event) {
209212
float devSumX = 0, devSumY = 0;
210213
for (int i = 0; i < count; i++) {
211214
if (skipIndex == i) continue;
212-
devSumX += Math.abs(event.getX(i) - focusX);
213-
devSumY += Math.abs(event.getY(i) - focusY);
215+
216+
// touchMajor/Minor are axes of an ellipse; average them together and
217+
// convert the resulting 'diameter' into a radius.
218+
final float touchSize = (event.getTouchMajor(i) + event.getTouchMinor(i)) / 4;
219+
devSumX += Math.abs(event.getX(i) - focusX) + touchSize;
220+
devSumY += Math.abs(event.getY(i) - focusY) + touchSize;
214221
}
215222
final float devX = devSumX / div;
216223
final float devY = devSumY / div;
@@ -228,7 +235,7 @@ public boolean onTouchEvent(MotionEvent event) {
228235
final boolean wasInProgress = mInProgress;
229236
mFocusX = focusX;
230237
mFocusY = focusY;
231-
if (mInProgress && (span == 0 || configChanged)) {
238+
if (mInProgress && (span < mMinSpan || configChanged)) {
232239
mListener.onScaleEnd(this);
233240
mInProgress = false;
234241
mInitialSpan = span;
@@ -238,7 +245,7 @@ public boolean onTouchEvent(MotionEvent event) {
238245
mPrevSpanY = mCurrSpanY = spanY;
239246
mInitialSpan = mPrevSpan = mCurrSpan = span;
240247
}
241-
if (!mInProgress && span != 0 &&
248+
if (!mInProgress && span > mMinSpan &&
242249
(wasInProgress || Math.abs(span - mInitialSpan) > mSpanSlop)) {
243250
mPrevSpanX = mCurrSpanX = spanX;
244251
mPrevSpanY = mCurrSpanY = spanY;

core/res/res/values/config.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,4 +925,10 @@
925925

926926
<!-- Maximum number of supported users -->
927927
<integer name="config_multiuserMaximumUsers">1</integer>
928+
929+
<!-- Minimum span needed to begin a touch scaling gesture.
930+
This also takes into account the size of any active touch points.
931+
Devices with screens that deviate too far from their assigned density
932+
bucket should consider tuning this value in a device-specific overlay. -->
933+
<dimen name="config_minScalingSpan">25mm</dimen>
928934
</resources>

core/res/res/values/symbols.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,6 +1112,8 @@
11121112
<java-symbol type="layout" name="media_route_list_item_collapse_group" />
11131113
<java-symbol type="string" name="bluetooth_a2dp_audio_route_name" />
11141114

1115+
<java-symbol type="dimen" name="config_minScalingSpan" />
1116+
11151117
<!-- From android.policy -->
11161118
<java-symbol type="anim" name="app_starting_exit" />
11171119
<java-symbol type="anim" name="lock_screen_behind_enter" />

0 commit comments

Comments
 (0)