Merge "Add rotary encoder support to scrolling containers" into cw-f-dev

This commit is contained in:
TreeHugger Robot
2016-08-30 03:10:45 +00:00
committed by Android (Google) Code Review
3 changed files with 82 additions and 58 deletions

View File

@@ -617,6 +617,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
private int mTouchSlop; private int mTouchSlop;
private float mDensityScale; private float mDensityScale;
private float mScrollFactor;
private InputConnection mDefInputConnection; private InputConnection mDefInputConnection;
private InputConnectionWrapper mPublicInputConnection; private InputConnectionWrapper mPublicInputConnection;
@@ -874,6 +876,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
final ViewConfiguration configuration = ViewConfiguration.get(mContext); final ViewConfiguration configuration = ViewConfiguration.get(mContext);
mTouchSlop = configuration.getScaledTouchSlop(); mTouchSlop = configuration.getScaledTouchSlop();
mScrollFactor = configuration.getScaledScrollFactor();
mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
mOverscrollDistance = configuration.getScaledOverscrollDistance(); mOverscrollDistance = configuration.getScaledOverscrollDistance();
@@ -4206,21 +4209,26 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
@Override @Override
public boolean onGenericMotionEvent(MotionEvent event) { public boolean onGenericMotionEvent(MotionEvent event) {
if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
switch (event.getAction()) { switch (event.getAction()) {
case MotionEvent.ACTION_SCROLL: case MotionEvent.ACTION_SCROLL:
if (mTouchMode == TOUCH_MODE_REST) { final float axisValue;
final float vscroll = event.getAxisValue(MotionEvent.AXIS_VSCROLL); if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) {
if (vscroll != 0) { axisValue = event.getAxisValue(MotionEvent.AXIS_VSCROLL);
final int delta = (int) (vscroll * getVerticalScrollFactor()); } else if (event.isFromSource(InputDevice.SOURCE_ROTARY_ENCODER)) {
axisValue = event.getAxisValue(MotionEvent.AXIS_SCROLL);
} else {
axisValue = 0;
}
final int delta = Math.round(axisValue * mScrollFactor);
if (delta != 0) {
if (!trackMotionScroll(delta, delta)) { if (!trackMotionScroll(delta, delta)) {
return true; return true;
} }
} }
}
break; break;
case MotionEvent.ACTION_BUTTON_PRESS: case MotionEvent.ACTION_BUTTON_PRESS:
if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) {
int actionButton = event.getActionButton(); int actionButton = event.getActionButton();
if ((actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY if ((actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY
|| actionButton == MotionEvent.BUTTON_SECONDARY) || actionButton == MotionEvent.BUTTON_SECONDARY)
@@ -4230,8 +4238,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
removeCallbacks(mPendingCheckForTap); removeCallbacks(mPendingCheckForTap);
} }
} }
break;
} }
break;
} }
return super.onGenericMotionEvent(event); return super.onGenericMotionEvent(event);

View File

@@ -129,6 +129,8 @@ public class HorizontalScrollView extends FrameLayout {
private int mOverscrollDistance; private int mOverscrollDistance;
private int mOverflingDistance; private int mOverflingDistance;
private float mScrollFactor;
/** /**
* ID of the active pointer. This is used to retain consistency during * ID of the active pointer. This is used to retain consistency during
* drags/flings if multiple pointers are used. * drags/flings if multiple pointers are used.
@@ -222,6 +224,7 @@ public class HorizontalScrollView extends FrameLayout {
mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
mOverscrollDistance = configuration.getScaledOverscrollDistance(); mOverscrollDistance = configuration.getScaledOverscrollDistance();
mOverflingDistance = configuration.getScaledOverflingDistance(); mOverflingDistance = configuration.getScaledOverflingDistance();
mScrollFactor = configuration.getScaledScrollFactor();
} }
@Override @Override
@@ -724,18 +727,24 @@ public class HorizontalScrollView extends FrameLayout {
@Override @Override
public boolean onGenericMotionEvent(MotionEvent event) { public boolean onGenericMotionEvent(MotionEvent event) {
if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
switch (event.getAction()) { switch (event.getAction()) {
case MotionEvent.ACTION_SCROLL: { case MotionEvent.ACTION_SCROLL: {
if (!mIsBeingDragged) { if (!mIsBeingDragged) {
final float hscroll; final float axisValue;
if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) {
if ((event.getMetaState() & KeyEvent.META_SHIFT_ON) != 0) { if ((event.getMetaState() & KeyEvent.META_SHIFT_ON) != 0) {
hscroll = -event.getAxisValue(MotionEvent.AXIS_VSCROLL); axisValue = -event.getAxisValue(MotionEvent.AXIS_VSCROLL);
} else { } else {
hscroll = event.getAxisValue(MotionEvent.AXIS_HSCROLL); axisValue = event.getAxisValue(MotionEvent.AXIS_HSCROLL);
} }
if (hscroll != 0) { } else if (event.isFromSource(InputDevice.SOURCE_ROTARY_ENCODER)) {
final int delta = (int) (hscroll * getHorizontalScrollFactor()); axisValue = event.getAxisValue(MotionEvent.AXIS_SCROLL);
} else {
axisValue = 0;
}
final int delta = Math.round(axisValue * mScrollFactor);
if (delta != 0) {
final int range = getScrollRange(); final int range = getScrollRange();
int oldScrollX = mScrollX; int oldScrollX = mScrollX;
int newScrollX = oldScrollX + delta; int newScrollX = oldScrollX + delta;
@@ -752,7 +761,6 @@ public class HorizontalScrollView extends FrameLayout {
} }
} }
} }
}
return super.onGenericMotionEvent(event); return super.onGenericMotionEvent(event);
} }

View File

@@ -135,6 +135,8 @@ public class ScrollView extends FrameLayout {
private int mOverscrollDistance; private int mOverscrollDistance;
private int mOverflingDistance; private int mOverflingDistance;
private int mScrollFactor;
/** /**
* ID of the active pointer. This is used to retain consistency during * ID of the active pointer. This is used to retain consistency during
* drags/flings if multiple pointers are used. * drags/flings if multiple pointers are used.
@@ -248,6 +250,7 @@ public class ScrollView extends FrameLayout {
mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
mOverscrollDistance = configuration.getScaledOverscrollDistance(); mOverscrollDistance = configuration.getScaledOverscrollDistance();
mOverflingDistance = configuration.getScaledOverflingDistance(); mOverflingDistance = configuration.getScaledOverflingDistance();
mScrollFactor = configuration.getScaledScrollFactor();
} }
@Override @Override
@@ -782,13 +785,19 @@ public class ScrollView extends FrameLayout {
@Override @Override
public boolean onGenericMotionEvent(MotionEvent event) { public boolean onGenericMotionEvent(MotionEvent event) {
if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
switch (event.getAction()) { switch (event.getAction()) {
case MotionEvent.ACTION_SCROLL: { case MotionEvent.ACTION_SCROLL:
if (!mIsBeingDragged) { final float axisValue;
final float vscroll = event.getAxisValue(MotionEvent.AXIS_VSCROLL); if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) {
if (vscroll != 0) { axisValue = event.getAxisValue(MotionEvent.AXIS_VSCROLL);
final int delta = (int) (vscroll * getVerticalScrollFactor()); } else if (event.isFromSource(InputDevice.SOURCE_ROTARY_ENCODER)) {
axisValue = event.getAxisValue(MotionEvent.AXIS_SCROLL);
} else {
axisValue = 0;
}
final int delta = Math.round(axisValue * mScrollFactor);
if (delta != 0) {
final int range = getScrollRange(); final int range = getScrollRange();
int oldScrollY = mScrollY; int oldScrollY = mScrollY;
int newScrollY = oldScrollY - delta; int newScrollY = oldScrollY - delta;
@@ -802,10 +811,9 @@ public class ScrollView extends FrameLayout {
return true; return true;
} }
} }
break;
} }
}
}
}
return super.onGenericMotionEvent(event); return super.onGenericMotionEvent(event);
} }